标签:
很典型的dfs题,但是涉及到很多的剪枝 。
s | ||||
| | ||||
| | ||||
| | ||||
+ | — | — | — | e |
s | — | — | — | |
— | — | + | ||
| | + | |||
| | ||||
+ | — | — | — | e |
#include"iostream" #include"stdio.h" #include"algorithm" #include"queue" #include"string.h" #include"string" #define mx 105 using namespace std; char maze[mx][mx]; int n,m,T,sx,sy,ex,ey; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; bool flag; bool judge(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m&&maze[x][y]==‘.‘) return true; return false; } void dfs(int x,int y,int t) { if(t>T||flag) return; if(t==T&&x==ex&&y==ey) {flag=true;return;} int temp=abs(x-ex)+abs(y-ey);//当前位置到目标位置的最短路径 temp=T-t-temp; if(temp%2) return;//奇偶剪枝,不加这个一直tle也是醉了 。 for(int i=0;i<4;i++) { int dx=x+dir[i][0]; int dy=y+dir[i][1]; if(judge(dx,dy)) { maze[dx][dy]=‘X‘; dfs(dx,dy,t+1); maze[dx][dy]=‘.‘; } } } int main() { int i,j,blocks; while(cin>>n>>m>>T,n&&m&&T) { flag=false;blocks=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { cin>>maze[i][j]; if(maze[i][j]==‘S‘) { sx=i;sy=j;maze[i][j]=‘X‘; } else if(maze[i][j]==‘D‘) { ex=i;ey=j;maze[i][j]=‘.‘; } else if(maze[i][j]==‘X‘) blocks++; } } if(n*m-blocks-1>=T)//如果给定的时间数比能走的格子数还要大的话,就肯定不满足条件了 dfs(sx,sy,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/acm-jing/p/4435143.html