Ali and Snoopy(利用广度搜索走迷宫)

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值