Judge Info
- Memory Limit: 32768KB
- Case Time Limit: 1000MS
- Time Limit: 1000MS
- Judger: Number Only Judger
Description
阿狸被困在迷宫,Snoopy要去救他,Snoopy可以向上、下、左、右四个方向行走,每走一步(格)就要喝掉一瓶益力多。
现在给他一个迷宫地图请问:snoopy最少需要多少瓶益力多才能找到阿狸。
Input
先输入一个数t,表示测试的数据个数
下面输入的就是t个迷宫
每个迷宫的输入都应包含以下数据
输入迷宫的大小 n(n<=15),表示迷宫大小为n*n,接下来的n行表示迷宫。用大写字母“S”表示snoopy的位置,用大写字母“E”表示阿狸被困的位置用“.”表示空白,用“*”表示障碍你知道的阿狸和snoopy都只有一个
Output
输出需要的最少的益力多的瓶数m (数据保证一定有最少需要的益利多的瓶数)
Sample Input
1 8 S..*.... .*...**. .**.**.. .*..*..* *..**.** ........ .***..*. ....*..E
Sample Output
16
广度搜索一般需要借助一个队列来存储每次搜索到的内容
#include<iostream>
using namespace std;
const int LINELENMAX=225;
struct line//
{
int coo[LINELENMAX][3];
int *p;
int *q;
line()
{
p=coo[0];
q=coo[0];
}
void push(int t,int* a)
{
q[0]=t;
q[1]=a[0];
q[2]=a[1];
q+=3;
}
void pop()
{
p+=3;
}
int *ask()
{
return p;
}
bool isnull()
{
if(p==q)
return true;
else
return false;
}
};
int scoo[2];
char map[15][15];
void help(int n)
{
int t=0;
line s;
int flag=0;
s.push(0,scoo);
map[scoo[0]][scoo[1]]='X';
int coo[2];
while(!flag)
{
while(s.ask()[0]==t)
{
coo[0]=s.ask()[1]-1;
coo[1]=s.ask()[2];
s.pop();
if(coo[0]>=0&&map[coo[0]][coo[1]]!='*'&&map[coo[0]][coo[1]]!='X')
{
if(map[coo[0]][coo[1]]=='E')
{
flag=1;
break;
}
s.push(t+1,coo);
map[coo[0]][coo[1]]='X';
}
coo[0]+=1;
coo[1]-=1;
if(coo[1]>=0&&map[coo[0]][coo[1]]!='*'&&map[coo[0]][coo[1]]!='X')
{
if(map[coo[0]][coo[1]]=='E')
{
flag=1;
break;
}
s.push(t+1,coo);
map[coo[0]][coo[1]]='X';
}
coo[0]+=1;
coo[1]+=1;
if(coo[0]<n&&map[coo[0]][coo[1]]!='*'&&map[coo[0]][coo[1]]!='X')
{
if(map[coo[0]][coo[1]]=='E')
{
flag=1;
break;
}
s.push(t+1,coo);
map[coo[0]][coo[1]]='X';
}
coo[0]-=1;
coo[1]+=1;
if(coo[1]<n&&map[coo[0]][coo[1]]!='*'&&map[coo[0]][coo[1]]!='X')
{
if(map[coo[0]][coo[1]]=='E')
{
flag=1;
break;
}
s.push(t+1,coo);
map[coo[0]][coo[1]]='X';
}
}
t++;
}
cout<<t<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
scoo[0]=i;
scoo[1]=j;
}
}
help(n);
}
return 0;
}