注意:把方向搞清楚就可以了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<sstream>
#include<ctype.h>
using namespace std;
int map[111][111];
int stx,sty,edx,edy;
bool vist[111][111];
bool ok;
int a[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
int n;
inline bool in(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<n;
}
void dfs(int x,int y)
{
//cout<<x<<' '<<y;
int i,j,k;
vist[x][y]=true;
if (x==edx&&y==edy)
{
ok=true;
return ;
}
int tox=-1,toy=-1;
int big=111;
for (i=0;i<4;i++)
{
int xx=x+a[i][0];
int yy=y+a[i][1];
if (in(xx,yy)&&!vist[xx][yy]&&map[xx][yy]!=-1&&big>map[xx][yy])
{
tox=xx;
toy=yy;
big=map[xx][yy];
}
}
if (big<111)
dfs(tox,toy);
}
int main()
{
freopen("in.txt","r",stdin);
int i,j,k;
int t;
cin>>t;
while (t--)
{
cin>>stx>>sty>>edx>>edy>>n;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cin>>map[i][j];
ok=false;
memset(vist,false,sizeof(vist));
if (map[stx][sty]!=-1)
dfs(stx,sty);
puts(ok?"Yes":"No");
}
return 0;
}
闯迷宫
Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 11 Tried: 24
Submit
Status
Best Solution
Back
Description
xm要闯迷宫了。迷宫由n行n列的房间构成(10<=n<=100),每个房间有四个门,分别通向左边、上面、右边和下面的房间,靠边的房间靠边的门当然通向迷宫外。神仙告诉xm,每个房间有一个困难值(范围为[0,100]),有一些房间是不能进的(用-1表示)。而且只要进入迷宫,不能再进入已进去过的房间,也不能出迷宫再进来。神仙答应xm,只要他能到达指定的房间,他会实现xm的一个愿望。
xm相信简单中也有大机会,每次在选择下一个房间时,他总是在能选择中的房间中选择难度最小的。他能否获得实现愿望的机会呢?
为方便起见,把迷宫看作一个矩阵,矩阵的每个元素对应一个房间,矩阵下标从0开始,最左边是第0列,最上边是第0行。你的任务是从给出的xm起始位置和神仙指定的房间位置,判断xm能否获得机会,如果能,则输出“Yes”;否则输出“No”。出现值相同时,按下、左、上、右的顺序,取较前者。
Input
含多组测试数据,输入首先是一个整数T表示测试数据组数(0 < T <= 150)。随后有T组测试数据,每组的第一行是5个用一个空格隔开的整数,前两个表示xm的起始位置,后两个表示目标房间位置,最后一个数字表示迷宫由 n*n个房间构成,随后是一个n*n的整数矩阵。
Output
对应每组测试数据,输出一行的结果。
Sample Input
2
0 3 5 1 6
56 8 30 44 94 -1
39 65 -1 -1 91 1
5 89 -1 25 -1 -1
51 38 -1 -1 7 20
10 -1 95 43 71 97
61 26 -1 57 70 65
0 3 1 5 6
56 8 30 44 94 -1
39 65 -1 -1 91 95
5 89 -1 25 -1 -1
51 38 -1 -1 7 20
10 -1 18 43 71 97
61 26 -1 57 70 65
Sample Output
Yes
No
Source
wxiaoping - 2012