迷宫求解.
Description
唐僧被妖怪关在迷宫中。孙悟空好不容易找到一张迷宫地图,并通过一个魔法门来到来到迷宫某个位置。假设迷宫是一个n*m的矩阵,它有两种地形,1表示平地,0表示沼泽,孙悟空只能停留在平地上。孙悟空目前的位置在坐标(sx,sy)处,他可以向上下左右四个方向移动。
请你帮助孙悟空计算一下,迷宫中是否存在一条路从他所在位置(sx,sy)到达唐僧所在位置(tx,ty)?
Input
输入第一行为一个整数t(0<t<=10),表示测试用例个数。
每个测试样例的第1行是2个正整数n (1≤n≤100),m (1≤n≤100),表示迷宫是n*m的矩阵。接下来的n行输入迷宫,每行有m个数字(0或者1),数字之间用一个空格间隔。
接下来的1行是4个整数sx,sy,tx,ty,1≤sx,tx≤n,1≤sy,ty≤m,表示孙悟空所在位置为第sx行第sy列,唐僧所在位置为第tx行第tx列。迷宫左上角编号是(1,1),右下角编号是(n, m)。
数据保证(sx,sy)格和(tx,ty)必定为平地。
Output
每个样例单独输出一行:1表示路径存在,0表示路径不存在。 |
#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
const int MAXN = 102;
bool visited[MAXN][MAXN];
int maze[MAXN][MAXN];
struct point{
int x;
int y;
point(int x,int y)
{
this->x = x;
this->y = y;
}
};
int next_x[4] = {-1,0,1,0};
int next_y[4] = {0,1,0,-1};
void bfs(int start_x,int start_y)
{
visited[start_x][start_y] = true;
queue<point> q;
q.push(point(start_x,start_y));
while(!q.empty())
{
point temp = q.front();
q.pop();
for(int i = 0;i < 4;i++)
{
int x = temp.x + next_x[i];
int y = temp.y + next_y[i];
if(!visited[x][y] && x >= 1 && y >= 1 && maze[x][y] == 1)
{
visited[x][y] = true;
q.push(point(x,y));
}
}
}
}
int main()
{
int n,col,row,start_x,start_y,end_x,end_y;
cin >> n;
while(n--)
{
cin >> col >> row;
for(int i = 1;i <= col;i++)
for(int j = 1;j <= row;j++)
cin >> maze[i][j];
cin >> start_x >> start_y >> end_x >> end_y;
memset(visited,false,sizeof(visited));
bfs(start_x,start_y);
if(visited[end_x][end_y])
cout << "1" << endl;
else
cout << "0" << endl;
}
return 0;
}