一道搜索题目,虽然挺简单,但很繁琐,在方向上纠结了好长时间。还好最后一遍AC。
#include<iostream>
#include<queue>
using namespace std;
int s_right(int dir,int tmpx,int tmpy);
int s_left(int dir,int tmpx,int tmpy);
int bfs();
const int dir_x[]={1,-1,0,0};//down up right left
const int dir_y[]={0,0,1,-1};
const int dir_left[4][4]={ 2,0,3,1,//down
3,1,2,0,//up
1,2,0,3,//right
0,3,1,2};//left
const int dir_right[4][4]={ 3,0,2,1,//down
2,1,3,0,//up
0,2,1,3,//right
1,3,0,2};//left
struct Node{
int x,y,step;
};
Node node;
bool left_Find,right_Find;
int c,r,s_x,s_y,e_x,e_y,Right,Left,Min;
char maze[50][50],Copy[50][50];
queue<Node> q;
int main(){
int t;
cin>>t;
for(int k=0;k<t;k++){
cin>>c>>r;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
cin>>maze[i][j];
Copy[i][j]=maze[i][j];
if(maze[i][j]=='S'){
s_x=i; s_y=j;
}
else if(maze[i][j]=='E'){
e_x=i; e_y=j;
}
}
Copy[s_x][s_y]='#'; Copy[e_x][e_y]='.';
node.x=s_x; node.y=s_y; node.step=1;
while(q.empty()==false)
q.pop();
q.push(node);
bfs();
Left=1; Right=1;
left_Find=false; right_Find=false;
if(s_x==r-1){
s_left(1,s_x,s_y);
s_right(1,s_x,s_y);
}
else if(s_x==0){
s_left(0,s_x,s_y);
s_right(0,s_x,s_y);
}
else if(s_y==0){
s_left(2,s_x,s_y);
s_right(2,s_x,s_y);
}
else if(s_y==c-1){
s_left(3,s_x,s_y);
s_right(3,s_x,s_y);
}
cout<<Left<<" "<<Right<<" "<<Min<<endl;
}
system("pause");
return 0;
}
int s_left(int dir,int tmpx,int tmpy){
int tmp_x,tmp_y,tmp_dir;
if(left_Find==true)
return 0;
for(int i=0;i<4;i++){
tmp_x=tmpx+dir_x[dir_left[dir][i]];
tmp_y=tmpy+dir_y[dir_left[dir][i]];
tmp_dir=dir_left[dir][i];
if(tmp_x==e_x&&tmp_y==e_y){
left_Find=true;
Left++;
return 0;
}
else if(tmp_x>=0&&tmp_x<r&&tmp_y>=0&&tmp_y<c&&maze[tmp_x][tmp_y]=='.'){
Left++;
break;
}
}
s_left(tmp_dir,tmp_x,tmp_y);
return 0;
}
int s_right(int dir,int tmpx,int tmpy){
int tmp_x,tmp_y,tmp_dir;
if(right_Find==true)
return 0;
for(int i=0;i<4;i++){
tmp_x=tmpx+dir_x[dir_right[dir][i]];
tmp_y=tmpy+dir_y[dir_right[dir][i]];
tmp_dir=dir_right[dir][i];
if(tmp_x==e_x&&tmp_y==e_y){
right_Find=true;
Right++;
return 0;
}
else if(tmp_x>=0&&tmp_x<r&&tmp_y>=0&&tmp_y<c&&maze[tmp_x][tmp_y]=='.'){
Right++;
break;
}
}
s_right(tmp_dir,tmp_x,tmp_y);
return 0;
}
int bfs(){
Node tmpn;
int tmp_x,tmp_y;
while(q.empty()==false){
tmpn=q.front();
for(int i=0;i<4;i++){
tmp_x=tmpn.x+dir_x[i]; tmp_y=tmpn.y+dir_y[i];
if(tmp_x>=0&&tmp_x<r&&tmp_y>=0&&tmp_y<c&&Copy[tmp_x][tmp_y]=='.'){
node.x=tmp_x; node.y=tmp_y; node.step=tmpn.step+1;
Min=node.step;
Copy[tmp_x][tmp_y]='#';
q.push(node);
}
}
q.pop();
if(Copy[e_x][e_y]=='#')
break;
}
return 0;
}