标签:
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