题目地址:点击打开链接
数组int visited[maxsize][maxsize][4][5];//4代表4个方向,5代编5中颜色,0,1,2,3代编北东南东西,Color:0,1,2,3,4
用来标记到达某个点的方向,颜色和时间。
注意输出格式!
C++代码:
#include <iostream>
#include <string>
#include <deque>
#include <cmath>
#include <cstring>
using namespace std;
const int maxsize = 30;
string s[maxsize];
int visited[maxsize][maxsize][4][5];//4代表4个方向,5代编5中颜色,0,1,2,3代编北东南东西,Color:0,1,2,3,4
int m,n;//m行n列
bool flag;
int start_x,start_y,end_x,end_y;
int add[4][2]={-1,0,0,-1,1,0,0,1};
int t;
struct MyStruct
{
int x;
int y;
int d;
int c;
};
void bfs(int x,int y,int d,int c)
{
visited[x][y][d][c]=0;
deque<MyStruct > dp;
MyStruct p;
p.x=x;p.y=y;p.d=d;p.c=c;
dp.push_back(p);
while(!dp.empty())
{
MyStruct q=dp.front();
if(q.x==end_x&&q.y==end_y&&q.c==0)
{
t=visited[q.x][q.y][q.d][q.c];
flag=true;
return ;
}
dp.pop_front();
int x_temp=q.x+add[q.d][0];
int y_temp=q.y+add[q.d][1];
int d=q.d;
int c=(q.c+1)%5;
if(x_temp>=0&&x_temp<m&&y_temp>=0&&y_temp<n&&visited[x_temp][y_temp][d][c]==-1&&s[q.x][q.y]!='#')
{
MyStruct r;
r.x=x_temp;r.y=y_temp;r.c=c;r.d=d;
visited[x_temp][y_temp][d][c]=visited[q.x][q.y][q.d][q.c]+1;
dp.push_back(r);
}
int d1=(q.d+1)%4;
int d2=(q.d-1+4)%4;
if(visited[q.x][q.y][d1][q.c]==-1)
{
MyStruct r;
r.x=q.x;r.y=q.y;r.d=d1;r.c=q.c;
visited[q.x][q.y][d1][q.c]=visited[q.x][q.y][q.d][q.c]+1;
dp.push_back(r);
}
if(visited[q.x][q.y][d2][q.c]==-1)
{
MyStruct r;
r.x=q.x;r.y=q.y;r.d=d2;r.c=q.c;
visited[q.x][q.y][d2][q.c]=visited[q.x][q.y][q.d][q.c]+1;
dp.push_back(r);
}
}
}
int main()
{
int cas=1;
while(cin>>m>>n&&(m||n))
{
int i,j;
for(i=0;i<m;++i)
{
cin>>s[i];
for(j=0;j<n;++j)
{
if(s[i][j]=='S')
{
start_x=i;
start_y=j;
}
else if(s[i][j]=='T')
{
end_x=i;
end_y=j;
}
}
}
memset(visited,-1,sizeof(visited));
flag=false;
bfs(start_x,start_y,0,0);
if(cas>1)
cout<<endl;
cout<<"Case #"<<cas++<<endl;
if(flag)
cout<<"minimum time = "<<t<<" sec"<<endl;
else
cout<<"destination not reachable"<<endl;
}
return 0;
}