标签:des style blog http io color ar os sp
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5343 Accepted Submission(s): 1503
搜索水题、
百度了下,目测网上基本都是搜索套搜索。。。。。
代码可能会有错、没怎么检查就水过了。
应该容易懂、不注释了 - -
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; #define INF 0x7ffffff #define N 8 struct node { int px,py; int bx,by; int step; }; int ans; int flag; int n,m; int px,py; int bx,by; int mpt[N][N]; int vis1[N][N]; int vis2[N][N][N][N]; int dir[4][2]={0,-1,0,1,-1,0,1,0}; bool judge(int x,int y) { if(x>=1 && x<=n && y>=1 && y<=m && mpt[x][y]!=1) return 1; return 0; } void bfs() { queue<node> q; node now,next; now.bx=bx; now.by=by; now.px=px; now.py=py; now.step=0; vis2[now.bx][now.by][now.px][now.py]=1; q.push(now); while(!q.empty()) { now=q.front(); q.pop(); if(mpt[now.bx][now.by]==3) { ans=min(ans,now.step); return; } for(int i=0;i<4;i++) { next=now; next.px+=dir[i][0]; next.py+=dir[i][1]; if(!judge(next.px,next.py)) continue; if(next.bx==next.px && next.by==next.py) { next.step++; next.bx+=dir[i][0]; next.by+=dir[i][1]; if(!judge(next.bx,next.by)) continue; } if(!vis2[next.bx][next.by][next.px][next.py]) { vis2[next.bx][next.by][next.px][next.py]=1; q.push(next); } } } } void dfs(int x,int y) { if(mpt[x][y]==4) { flag=1; return; } if(flag) return; for(int i=0;i<4;i++) { int tx=x+dir[i][0]; int ty=y+dir[i][1]; if(judge(tx,ty) && mpt[tx][ty]!=2 && !vis1[tx][ty]) { vis1[tx][ty]=1; dfs(tx,ty); vis1[tx][ty]=0; } } } int main() { int T,i,j; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&mpt[i][j]); if(mpt[i][j]==2) { bx=i; by=j; } } } ans=INF; for(i=0;i<4;i++) { px=bx+dir[i][0]; py=by+dir[i][1]; if(judge(px,py)) { flag=0; memset(vis1,0,sizeof(vis1)); dfs(px,py); if(flag) { memset(vis2,0,sizeof(vis2)); bfs(); } } } if(ans==INF) cout<<-1<<endl; else cout<<ans<<endl; } return 0; }
标签:des style blog http io color ar os sp
原文地址:http://www.cnblogs.com/hate13/p/4102523.html