Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
即使AC也不一定正确...想提高的看看(我认为)正确的代码吧#include<iostream> #include<queue> #include<string.h> using namespace std; const int maxn=80; char g[maxn][maxn]; bool vis[maxn][maxn]; int dis[maxn][maxn]; int go[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int x1,y1,x2,y2; int w,h; void bfs(int x,int y) { queue <int> q; int tmp=x*(w+2)+y; q.push(tmp); vis[x][y]=true; while(!q.empty()) { tmp=q.front(); x=tmp/(w+2); y=tmp%(w+2); q.pop(); if(x==x2 && y==y2) return; for(int i=0;i<4;i++) { int nx=x+go[i][0]; int ny=y+go[i][1]; //这种做法才是正确的:一走到底,绝不回头 //有点DFS的味道,就是一行一列走到底 while(nx>=0 && nx<=h+1 && ny>=0 && ny<=w+1 && !vis[nx][ny] && g[nx][ny]!='X') { tmp=nx*(w+2)+ny; vis[nx][ny]=true; dis[nx][ny]=dis[x][y]+1; q.push(tmp); nx=nx+go[i][0]; ny=ny+go[i][1]; } } } } int main() { int i; freopen("1.txt","r",stdin); int k=0; while(scanf("%d%d",&w,&h)!=EOF && (w||h)) { memset(g,0,sizeof(g)); for(i=1;i<=h;i++) { getchar(); for(int j=1;j<=w;j++) scanf("%c",&g[i][j]); } printf("Board #%d:\n",++k); int t=0; while(scanf("%d%d%d%d",&y1,&x1,&y2,&x2) && (x1||y1||x2||y2)) { memset(vis,false,sizeof(vis)); memset(dis,0,sizeof(dis)); g[x2][y2]=0; bfs(x1,y1); if(dis[x2][y2]==0) printf("Pair %d: impossible.\n",++t); else printf("Pair %d: %d segments.\n",++t,dis[x2][y2]); g[x2][y2]='X'; //注意还原 } printf("\n"); } return 0; } 感谢http://hi.baidu.com/shouzhewei/blog/item/de55b8b6a40fcf7e8ad4b247.html 在网上找的一个AC过的正确代码,谢谢大牛 我稍微改了一下,sorry了 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator