题目链接
P1605 迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
本来以为是简单题,结果像以前一样用bfs才得40分。bfs的搜索路上的标记会影响到其他路线的进行,所以答案远远少于正确值。
用dfs才比较快速的写出来。
(但是还不太会)
dfs的思路就是不见黄河不回头,使用递归先把走过的地方给标记了,结束再还回来。写过一段时间bfs在写dfs能比较理解了。
AC代码
#include <iostream>
using namespace std;
int n, m;
int t;
int sx, sy;
int fx, fy;//题目给的变量
bool visited[6][6];//地图障碍兼走过的路径标记
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int ans;
void dfs(int x,int y)
{
if(x==fx&&y==fy)
{
ans++;//满足条件时增加条数,结束递归。
return;
}
else
{
for(int i=0;i<4;i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!visited[nx][ny])//如果合法则往下搜索
{
visited[nx][ny] = true;//先打上标记
dfs(nx, ny);//往下走
visited[nx][ny] = false;//走完复原标记,这样就不会和其他路线冲突
}
}
}
}
int main(int argc, char* argv[])
{
cin >> n >> m >> t;
cin >> sx >> sy;
cin >> fx >> fy;
visited[sx][sy] = true;//记得开始点要打标记,防止重复走起点
for(int i=0;i<t;i++)
{
int t1, t2;
cin >> t1 >> t2;
visited[t1][t2] = true;
}
dfs(sx, sy);
cout << ans;
return 0;
}
心得
这个真的是大水题了。也可以用来入门dfs,比八皇后还简单。小摸一天!