HDU解题报告——1728

来源:互联网 发布:电脑怎么连接本地网络 编辑:程序博客网 时间:2024/05/09 06:26

  BFS一道题,不过挺容易错的,首先是不同于一般的走迷宫,我们需要得到的是到终点需要的拐弯数,所以一次遍历一个方向,另外题目原话“其中x1,x2对应列,y1, y2对应行。”,切记啊,就因为这个WA了三次,完了其他和普通走迷宫遍历的方法就没什么区别了,代码如下:

#include <iostream>#include <queue>#include <cstring>using namespace std;int mark[105][105];char a[105][105];typedef struct point{int x,y;}pi;bool bfs(int y1,int x1,int y2,int x2,int k){if((x1==x2)&&(y1==y2)) return true;if(a[x1][y1]=='*'||a[x2][y2]=='*') return false;queue<pi> p;pi t;t.x=x1;t.y=y1;p.push(t);while(!p.empty()){int x=p.front().x,y=p.front().y;for(int i=x-1;a[i][y]=='.';i--) {if(mark[i][y]) continue;mark[i][y]=mark[x][y]+1;t.x=i;t.y=y;p.push(t);}for(int i=x+1;a[i][y]=='.';i++) {if(mark[i][y]) continue;mark[i][y]=mark[x][y]+1;t.x=i;t.y=y;p.push(t);}for(int i=y-1;a[x][i]=='.';i--) {if(mark[x][i]) continue;mark[x][i]=mark[x][y]+1;t.x=x;t.y=i;p.push(t);}for(int i=y+1;a[x][i]=='.';i++) {if(mark[x][i]) continue;mark[x][i]=mark[x][y]+1;t.x=x;t.y=i;p.push(t);}p.pop();if(mark[x2][y2]){if((mark[x2][y2]-1)<=k) return true;else return false;}}return false;}int main(){int t;cin>>t;while(t--){int m,n,x1,x2,y1,y2,k;memset(a,'*',sizeof(a));memset(mark,0,sizeof(mark));cin>>m>>n;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++) cin>>a[i][j];cin>>k>>x1>>y1>>x2>>y2;if(bfs(x1,y1,x2,y2,k)) cout<<"yes"<<endl;else cout<<"no"<<endl;}return 0;}
0 0
原创粉丝点击