您的位置:首页 > 其它

hdu 1728 逃离迷宫

2013-07-17 14:56 337 查看
链接:点击打开链接

思路:一开始我是往左和往右走,不转弯,计数不用加,往上和往下走,就转弯,计数就加一,进行广搜,搜到最后那个点,比较就可以啦,但是华丽丽的WA啦。所以改一条路搜到底,走不了啦,就一定要转弯啦。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int x;
int y;
int count;
};
int m,n,k,x1,x2,y1,y2;
int a[4][2]={-1,0,1,0,0,-1,0,1};
bool vis[110][110];
char str[110][110];
void bfs(){
int i;
if(y1==y2&&x1==x2){
printf("yes\n");
return;
}
queue<node>Q;
node p,q;
p.x=y1;
p.y=x1;
p.count=-1;
vis[p.x][p.y]=true;
Q.push(p);
while(!Q.empty()){
p=Q.front();
Q.pop();
for(i=0;i<4;i++){
q=p;
q.x=p.x+a[i][0];
q.y=p.y+a[i][1];
while(q.x>0&&q.x<=m&&q.y>0&&q.y<=n&&str[q.x][q.y]=='.'){
if(!vis[q.x][q.y]){
q.count=p.count+1;
if(q.x==y2&&q.y==x2&&q.count<=k){
printf("yes\n");
return;
}
vis[q.x][q.y]=true;
Q.push(q);
}
q.x=q.x+a[i][0];
q.y=q.y+a[i][1];
}
}
}
printf("no\n");
return;
}
int main(){
int t,i,j;
scanf("%d",&t);
while(t--){
scanf("%d %d",&m,&n);
for(i=1;i<=m;i++){
getchar();
for(j=1;j<=n;j++)
scanf("%c",&str[i][j]);
}
scanf("%d %d %d %d %d",&k,&x1,&y1,&x2,&y2);
memset(vis,false,sizeof(vis));
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: