标签:
这道题一开始做成dfs,求最短路径去了。后来发现要在t时刻时恰好到达,所以要用bfs。然后学到一个奇偶剪枝的技巧。
s
|
||||
|
|
||||
|
|
||||
|
|
||||
+
|
—
|
—
|
—
|
e
|
s
|
—
|
—
|
—
|
|
—
|
—
|
+
|
||
|
|
+
|
|||
|
|
||||
+
|
—
|
—
|
—
|
e
|
#include <iostream> #include <cmath> using namespace std; int vis[8][8]; char map[8][8]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int n,m,t,sx,sy,gx,gy,flag; #define judge(x,y) vis[x][y]==0&&map[x][y]!=‘X‘&&0<=x&&x<n&&0<=y&&y<m//一开始写成==‘.‘ 导致走不到(gx,gy)因为它是‘D’ void init() { flag=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { vis[i][j]=0; cin>>map[i][j]; if(map[i][j]==‘S‘) { sx=i;sy=j; } if(map[i][j]==‘D‘) { gx=i;gy=j; } } } void bfs(int x,int y,int tt) { if(tt>t) return ;//剪枝 if(flag==1) return ; if(x==gx&&y==gy&&tt==t) { flag=1; } for(int i=0;i<4;i++) { int nx=x+dx[i]; int ny=y+dy[i]; if(judge(nx,ny)) { vis[nx][ny]=1; bfs(nx,ny,tt+1); vis[nx][ny]=0; } } } int main() { while(cin>>n>>m>>t) { if(n==0&&m==0&&t==0) break; init(); //奇偶剪枝***** int p=abs(sx-gx)+abs(sy-gy)+t; if(p%2==1||p-2*t>0) //if(abs(sx-gx)+abs(sy-gy)>t||(sx+gx+sy+gy+t)%2==1) cout<<"NO"<<endl; else { vis[sx][sy]=1;//没有记录(sx,sy)为已走过 WA了一次 bfs(sx,sy,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
反思:
①The input is terminated with three 0‘s. This test case is not to be processed 可以用 &&(n+m+k) 即n、m、k同时为0。
②#define judge(x,y) 里面 ,map[x][y]!=‘X‘,一开始写成==‘.‘, 导致走不到(gx,gy),因为它是‘D’。
③没有记录(sx,sy)为已走过 WA了一次
④p那个地方可能出现负的,所以用abs(sx-gx)+abs(sy-gy)和t相加而不是相减;
标签:
原文地址:http://www.cnblogs.com/luosuo10/p/5190922.html