您的位置:首页 > 其它

TOJ 2470Robot in Maze (广度搜索应用)

2016-07-19 22:45 357 查看
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
char map[200][200];
int visited[200][200][4]; //标识该位置是否被访问
int row,col;
int sx[4]={-1,0,1,0};
int sy[4]={0,1,0,-1};
typedef struct Node{
int x;
int y;
int face;
int step;
}node;
node s,e;
node queue[160000];
int judge(int x,int y){
return x>=0&&x<row&&y>=0&&y<col&&map[x][y]!='#';
}
int BFS(){
int i,j,k,top,tx,ty,ex,ey,face;
ex=e.x;
ey=e.y;
queue[0]=s;
visited[s.x][s.y][0]=1;
top=1;
for(i=0;i<top;i++){
//向前进
tx=queue[i].x+sx[queue[i].face];
ty=queue[i].y+sy[queue[i].face];
face=queue[i].face;
if(judge(tx,ty)&&!visited[tx][ty][queue[i].face]){
queue[top].x=tx;
queue[top].y=ty;
queue[top].face=queue[i].face;
queue[top].step=queue[i].step+1;
visited[tx][ty][face]=1;
if(map[tx][ty]=='T'){
return queue[top].step;
}
top++;
}
//向右转
tx=queue[i].x;
ty=queue[i].y;
face=(queue[i].face+1)%4;
if(!visited[tx][ty][face]){
queue[top].x=tx;
queue[top].y=ty;
queue[top].face=face;
queue[top].step=queue[i].step+1;
visited[tx][ty][face]=1;
if(map[tx][ty]=='T'){
return queue[top].step;
}
top++;
}
//向左转
tx=queue[i].x;
ty=queue[i].y;
face=(queue[i].face+3)%4;
if(!visited[tx][ty][face]){
queue[top].x=tx;
queue[top].y=ty;
queue[top].face=face;
queue[top].step=queue[i].step+1;
visited[tx][ty][face]=1;
if(map[tx][ty]=='T'){
return queue[top].step;
}
top++;
}
}
return -1;
}
int main(){
int n,i,j,k;
char c;
scanf("%d",&n);
while(n--){
scanf("%d%d",&row,&col);
getchar();
for(i=0;i<row;i++){
for(j=0;j<col;j++){
c=getchar();
map[i][j]=c;
if(map[i][j]=='S'){
s.x=i;
s.y=j;
}
if(map[i][j]=='T'){
e.x=i;
e.y=j;
}
}
getchar();
}
s.face=0;
s.step=0;
memset(visited,0,sizeof(visited));
printf("%d\n",BFS());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  广度搜索应用