noj 1009 E 迷宫问题

Problem E

迷宫问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

 

给一个20×20的迷宫、起点坐标和终点坐标,问从起点是否能到达终点。

输入:

 

多个测例。输入的第一行是一个整数n,表示测例的个数。接下来是n个测例,每个测例占21行,第一行四个整数x1,y1,x2,y2是起止点的位置(坐标从零开始),(x1,y1)是起点,(x2,y2)是终点。下面20行每行20个字符,’.’表示空格;’X’表示墙。

输出:

 

每个测例的输出占一行,输出Yes或No。

输入样例:

 

 

2
0 0 19 19
....................
XXXXXXXXXXXXXXXXXXXX
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
0 0 19 19
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................

输出样例:

 

 

No
Yes

 

 

#include <iostream>
#include <string.h>

using namespace std;

int n;
int sx,sy,ex,ey;
char G[20][20];
int action[2][4] = {0, 0, 1, -1,
					1, -1, 0, 0};
int vis[20][20];

bool check(int x, int y, int i)
{
	x += action[0][i];
	y += action[1][i];
	if(x < 0 || x >= 20 || y < 0 || y >= 20) //超过地图范围
	{
		return false;
	}
	if(G[x][y] == 'X' || vis[x][y] == 1)	//碰到墙,或者已经访问过
	{
		return false;
	}
	return true;
}

//深搜
void dfs(int x, int y)
{
	vis[x][y] = 1;
	for (int i = 0; i < 4; ++i)
	{
		if(check(x, y, i))
		{
			dfs(x + action[0][i], y + action[1][i]);
		}
	}
}


int main(int argc, char const *argv[])
{
	cin>>n;
	while(n--)
	{
		cin >> sx >> sy >> ex >> ey;
		for (int i = 0; i < 20; ++i)
		{
			for (int j = 0; j < 20; ++j)
			{
				cin>>G[i][j];
			}
		}
		//访问标记初始化
		memset(vis, 0, sizeof(vis));
		
		dfs(sx, sy);
		

		if(vis[ex][ey])
		{
			cout<<"Yes"<<endl;
		}
		else
		{
			cout<<"No"<<endl;
		}
	}

	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值