这道题让我明白到,广度优先搜索的多维运用,而且要会灵活使用广度优先搜索,最坑爹的是我在方向那里被坑了半天!!!说一个位的颜色不同是一个维度可能比较容易理解,但是说一个格还要考虑方向这个维度,一开始也是想了一下,虽然同一个位置,同一种颜色,但是方向的不同却有可能导致它到另外一个格的时间不一样了,因为改变方向也需要时间,还有一个很坑爹的就是我一开始以为到了一个位置后,走到下一个位置再走回来的时候,是沿路返回,可以倒车,颜色会不变,不单只是是回到原位,连颜色也回到原来的数值,脑残,不是倒车,是改变方向,掉头前进,这样的话颜色就变了。
#include<stdio.h>
#include<string.h>
#define max -1
typedef struct node{
int dire,color,r,c;
node *next;
node(int row,int col,int d,int clr){
r=row;
c=col;
dire=d;
color=clr;
next=NULL;
}
}node;
int minTime[30][30][5][4],vis[30][30][5][4],
dires[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//竟然在方向这里纠结了一天!!!!!!注意坐标的上下左右究竟是加多少
char square[30][30];
node *top,*rear;
void push(int pt,int i,int j,int d,int c,int step){
if((minTime[i][j][c][d]==max||minTime[i][j][c][d]>pt+step)&&square[i][j]=='.'){
minTime[i][j][c][d]=pt+step;
if(!vis[i][j][c][d])
{
vis[i][j][c][d]=1;
rear->next=new node(i,j,d,c);
rear=rear->next;
}
}
}
main()
{
int M,N,i,j,end[2],pt,min,t=0,a,b;
while(scanf("%d %d",&M,&N),M,N){
getchar();
memset(minTime,-1,sizeof(minTime));
memset(vis,0,sizeof(vis));
for(i=1;i<=M;i++){
gets(&square[i][1]);
for(j=1;j<=N;j++){
if(square[i][j]=='S'){
square[i][j]='.';
rear=top=new node(i,j,0,0);
minTime[i][j][0][0]=0;
vis[i][j][0][0]=1;
}
else if(square[i][j]=='T'){
end[0]=i;
end[1]=j;
square[i][j]='.';
}
}
}
memset(square[i],0,N+2);
while(top!=NULL){
pt=minTime[top->r][top->c][top->color][top->dire];
push(pt,top->r+dires[top->dire][0],top->c+dires[top->dire][1],top->dire,(top->color+1)%5,1);//direction 原方向
push(pt,top->r,top->c,(top->dire+2)%4,top->color,2);//direction 原方向的逆方向
push(pt,top->r,top->c,(top->dire+3)%4,top->color,1);
push(pt,top->r,top->c,(top->dire+1)%4,top->color,1);
vis[top->r][top->c][top->color][top->dire]=0;
top=top->next;
}
min=minTime[end[0]][end[1]][0][0];
for(i=1;i<4;i++){
if(minTime[end[0]][end[1]][0][i]!=max&&min>minTime[end[0]][end[1]][0][i]) min=minTime[end[0]][end[1]][0][i];
}
if(t)printf("\n");
if(min==-1)
printf("Case #%d\ndestination not reachable\n",++t);
else printf("Case #%d\nminimum time = %d sec\n",++t,min);
}
}