标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 89317 Accepted Submission(s):
24279
/* *0 1 0 1 0 1 *1 0 1 0 1 0 *0 1 0 1 0 1 *1 0 1 0 1 0 *0 1 0 1 0 1 *1 0 1 0 1 0 * *如上图所示: *从0->1和从1->0步数都是奇数 *从0->0和从1->1步数都是偶数 *则当所要求的步数是偶数是我 *们就可以舍去步数是奇数的路 *线,同样,当所要求的步数是 *奇数时,我们可以舍去步数是 *偶数的路线 即判断: *(x2-x1+y2-y1)&1 是否 ==k&1 */
AC代码:
#include<stdio.h>
#include<string.h>
int x1,x2,y1,y2;
char map[10][10];
int n,m,k,ok;
int move[4][2]={0,1,0,-1,1,0,-1,0};
int judge(int r,int c)
{
if(map[r][c]==‘X‘||r<0||r>=n||c<0||c>=m)
return 0;
return 1;
}
void dfs(int x,int y,int step)//step记录走的步数
{
int i;
if(ok) return ;//搜索到结果
if(step>k) return ;//步数大于k
else if(step==k)
{
if(x==x2&&y==y2)
ok=1;
return ;
}
else
{
for(i=0;i<4;i++)
{
int tx=x+move[i][0];
int ty=y+move[i][1];
if(judge(tx,ty))
{
map[x][y]=‘X‘;//标记走过的位置
dfs(tx,ty,step+1);
map[x][y]=‘.‘;//回溯取消标记
}
}
}
}
int main()
{
int i,j,wall;
while(scanf("%d %d %d",&n,&m,&k),n||m||k)
{
ok=0;
wall=0;
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]==‘S‘)
{
x1=i;
y1=j;
}
else if(map[i][j]==‘D‘)
{
x2=i;
y2=j;
}
else if(map[i][j]==‘X‘)
wall++;
}
}
//前句是奇偶剪枝 ,后一句是判断如果可以走的空地小于要求的步数也不可以
if(((x2-x1+y2-y1)&1)!=(k&1)||n*m-wall<=k)
{
printf("NO\n");
continue;
}
dfs(x1,y1,0);
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
hdoj 1010 Tempter of the Bone【dfs查找能否在规定步数时从起点到达终点】【奇偶剪枝】
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4705575.html