分析:
我们把颜色和方向连同坐标一起加入状态
之后bfs搜索就好了
注意:
转向是不会改变颜色的
相邻两组数据的输出之间应有一个空行
找到了额外的样例
(不要直接复制哦,博客上的格式可能有问题)
Sample Input
1 3
S#T
10 10
#S…….#
#..#.##.##
#.##.##.##
.#….##.#
##.##..#.#
#..#.##…
#……##.
..##.##…
#.###…#.
#…..###T
5 5
#S#..
#.#..
#.###
#…T
#####
10 10
S………
……….
……….
……….
……….
……….
……….
……….
……….
……..T.
3 3
ST#
##.
.#.
25 25
S……………………
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
…………………….
……………………T
6 6
#.#…
#.S.#.
#####.
#..#..
#T##..
……
0 0
Sample Output
Case #1
destination not reachable
Case #2
minimum time = 49 sec
Case #3
minimum time = 17 sec
Case #4
minimum time = 30 sec
Case #5
minimum time = 14 sec
Case #6
minimum time = 55 sec
Case #7
minimum time = 30 sec
tip
不要无脑输出空行
输出的最后不能有多余空行
坐标和颜色的计算一定要注意
这就告诉我们一个真理:
比赛的时候,一定要用文件操作看一下输出格式是否合法
再也不要输出多余空格,空行和回车了
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
struct node{
int x,y,d,c,t;
};
node q[50000];
char s[30];
int tou,wei,mp[30][30];
bool p[30][30][4][5];
node t;
int pd(int bh)
{
if (q[bh].x==t.x&&q[bh].y==t.y&&q[bh].c==0) return 1;
return 0;
}
int bfs()
{
do
{
tou++;
int xa=q[tou].x;
int ya=q[tou].y;
int cc=q[tou].c;
int da=q[tou].d;
int xx=xa,yy=ya,dd=da;
int time=q[tou].t+1;
// 朝向不变
if (da==0) xx=xa-1;
else if (da==1) yy=ya+1;
else if (da==2) xx=xa+1;
else yy=ya-1;
if (xx>0&&yy>0&&xx<=n&&yy<=m&&p[xx][yy][dd][(cc+1)%5]&&mp[xx][yy]!=-1)
{
wei++;
p[xx][yy][dd][(cc+1)%5]=0;
q[wei].x=xx; q[wei].y=yy;
q[wei].d=dd; q[wei].c=(cc+1)%5;
q[wei].t=time;
if (pd(wei)) return time;
}
//左转
xx=xa,yy=ya;
if (da==0) dd=3;
else if (da==1) dd=0;
else if (da==2) dd=1;
else dd=2;
if (p[xx][yy][dd][cc]&&mp[xx][yy]!=-1)
{
wei++;
p[xx][yy][dd][cc]=0;
q[wei].x=xx; q[wei].y=yy;
q[wei].d=dd; q[wei].c=cc;
q[wei].t=time;
if (pd(wei)) return time;
}
//右转
xx=xa,yy=ya;
if (da==0) dd=1;
else if (da==1) dd=2;
else if (da==2) dd=3;
else dd=0;
if (p[xx][yy][dd][cc]&&mp[xx][yy]!=-1)
{
wei++;
p[xx][yy][dd][cc]=0;
q[wei].x=xx; q[wei].y=yy;
q[wei].d=dd; q[wei].c=cc;
q[wei].t=time;
if (pd(wei)) return time;
mp[xx][yy]=time;
}
}
while (tou<wei);
return -1;
}
int main()
{
int T=0;
int ans=-2;
scanf("%d%d",&n,&m);
while (n!=0&&m!=0)
{
if (ans!=-2) puts("");
tou=wei=0;
memset(p,1,sizeof(p));
memset(mp,0,sizeof(mp));
for (int i=1;i<=n;i++)
{
scanf("%s",s+1);
for (int j=1;j<=m;j++)
if (s[j]=='#')
mp[i][j]=-1;
else if (s[j]=='S')
{
wei++;
q[wei].x=i; q[wei].y=j;
q[wei].d=0; q[wei].c=0;
q[wei].t=0;
p[i][j][0][0]=0;
}
else if (s[j]=='T')
{
t.x=i;
t.y=j;
t.c=0;
}
}
printf("Case #%d
",++T);
ans=bfs();
if (ans!=-1)
printf("minimum time = %d sec
",ans);
else
printf("destination not reachable
");
scanf("%d%d",&n,&m);
}
return 0;
}