广度优先搜索算法(例题maze)

maze

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 158   Solved: 39
[ Submit][ Status][ Web Board]

Description

500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王抓走,并困在了一个巨大的迷宫中。Jesse听到这个消息,非常紧张。他知道公主在迷宫中还能坚持T个小时,他急忙赶到迷宫,开始到处寻找公主的下落。
Jesse会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能在所剩的时间内找到心爱的公主。

Input

题目包括多组测试数据。每组测试数据以三个整数N,M,T 开头,分别代表迷宫的长、高以及公主能坚持的小时数。

紧接着有M行,N列字符,由".","*","P","S"组成。

其中"." 代表能够行走的空地。"*" 代表墙壁,Jesse不能从此通过。

"P" 是公主所在的位置。

"S" 是Jesse的起始位置。

每次Jesse只能选择“上、下、左、右”任意一个方向走一步。 每走一步花费1个小时。

输入以0 0 0结束。


Output

如果能在规定时间内救出公主输出“YES”,否则输出“NO”。

Sample Input

4 4 10
....
....
....
S**P
0 0 0

Sample Output

YES

HINT

测试样例中,王子从S点,上 右 右 右 下,一共花了五个小时刚好找到公主所在的P点



这道题把所有的走的情况放在队列里然后出队判断最先走出来的一定是最快的然后判断时间是不是符合就OK,不多说上代码

# include
# include


using namespace std;


struct node
{
int x, y, time;
};
queue q;


int n, m, t;
char ch[105][105];
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

//sx,sy起点,px,py终点
int sx,  sy,  px,  py;
bool bfs()
{
while(!q.empty())
{
q.pop();
}
struct node temp, flag;
temp.x = sx;
temp.y = sy;
temp.time = 0;
q.push(temp);


while(!q.empty())
{
//我把队头的值取出来,然后出队
flag = q.front();
q.pop();
if(flag.x == px && flag.y == py && flag.time <= t)
{
return true;
}
for(int i = 0; i < 4; i++)
{
int tx = flag.x + dir[i][0];
int ty = flag.y + dir[i][1];
if(tx < 0 || tx >= m || ty < 0 || ty >= n)
{
continue;
}
if(ch[tx][ty] == '.')
{
temp.x = tx;
temp.y = ty;
temp.time = flag.time +1;
q.push(temp);

//走过之后就弄成*防止重复
ch[tx][ty] = '*';
}
}
}
return false;
}


int main(int argc, char *argv[])
{
while(cin >> n >> m >> t && ( n || m || t))
{


for(int i = 0; i < m; i++)
{
cin >> ch[i];
}


for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(ch[i][j] == 'S')
{
sx = i;sy = j;
}
//这里一步很关键,把p点记录下来后标记可走,函数里面判断
if(ch[i][j] == 'P')
{
px = i;py = j;
ch[i][j] = '.';
}


}
}
if(bfs())
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}


}


return 0;
}




你可能感兴趣的:(ACM算法题)