4 4 5 S.X. ..X. ..XD .... 3 4 5 S.X. ..X. ...D 0 0 0
NO YES//本题注意: //1.注意修枝!!!可以数数修了多少个支。。 //2.数组赋值i从1开始,否则超时 //3.输入字符用cin , 用scanf超时 /*做完这个搜索,我算是醉了。。*/ #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; int t,n,m; bool flag; int stax,stay,endx,endy,wall; char map[10][10]; int f[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; void DFS(int stx,int sty,int step) { if(stx<1||sty<1||stx>n||sty>m) return; <span style="font-family: 'Courier New', Courier, monospace;">//修一修</span> if(step==t&&stx==endx&&sty==endy) <span style="font-family: 'Courier New', Courier, monospace;">//修一修</span> { flag=true; return; } if(flag) return; //修一修 int temp=t-step-abs(endx-stx)-abs(endy-sty); //修一修,详解如下! <span style="white-space:pre"> </span>if(temp<0||temp%2==1) return; for(int i=0;i<4;i++) { if(map[stx+f[i][0]][sty+f[i][1]]!='X') { map[stx+f[i][0]][sty+f[i][1]]='X'; DFS(stx+f[i][0],sty+f[i][1],step+1); map[stx+f[i][0]][sty+f[i][1]]='.'; } } return; } int main() { while(~scanf("%d%d%d",&n,&m,&t)) { if(!m && !n && !t) break; wall=0; flag=false; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>map[i][j]; if(map[i][j]=='S') //标记起点 { stax=i; stay=j; } if(map[i][j]=='D') //标记终点 { endx=i; endy=j; } if(map[i][j]=='X') //方便剪枝 { wall++; } } } if(t>=m*n-wall) //修一修 { printf("NO\n"); continue; } map[stax][stay]='X'; DFS(stax,stay,0); printf(flag? "YES\n" :"NO\n"); } return 0; }********************************版权所有*******************************************如果abs(x-y)+abs(dx-dy)为偶数,则说明 abs(x-y) 和 abs(dx-dy)的奇偶性相同,需要走偶数步
如果abs(x-y)+abs(dx-dy)为奇数,那么说明 abs(x-y) 和 abs(dx-dy)的奇偶性不同,需要走奇数步
而 (ti-setp)表示剩下还需要走的步数,由于题目要求要在 ti时 恰好到达,那么 (ti-step) 与 abs(x-y)+abs(dx-dy) 的奇偶性必须相同
因此 temp=ti-step-abs(dx-x)-abs(dy-y) 必然为偶数!
HDoj-1010-Tempter of the Bone-DFS
原文地址:http://blog.csdn.net/holyang_1013197377/article/details/41620867