Date: 2019/10/10
Degree of difficulty:Universal
Original question:P1605 迷宫
又是一道dfs的题
这个题的思路就是——递归位置,循环方向,回溯——
我们来看看需要考虑的东西
- 输入
- 如何打表找位置
- 注意事项
1.输入
输入的时候需要借助一个map函数来帮助确定障碍的位置
还需要一个vis函数来记录走过的位置
起点需要打标记!!!!!!
(错误警告)
因为如果起点不打标记,那么后面的递归中,起点就会被重复利用好多次,有可能( 一定会 )多于你想要的结果
所以起点要打标记
2.如何打表找位置
打表找位置
说的简单就是用数组把方向存了
这个比较简单,显然
循环的时候也要注意一下不要越界
- 弱鸡写法
int movx[5]={1,0,-1,0};
int movy[5]={0,-1,0,1};//打表找方向
- 有大佬把两个合了起来(interesting
int mov[6]={1,0,-1,0,1};
xx+= mov[i];
yy+= mov[i+1];
3.注意事项
没啥注意的,888
溜了溜了
AC code
//Author:PhilFan;
#include<bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,fx,fy,x,y,cnt;
int map[20][20],vis[20][20];
int movx[5]={1,0,-1,0};
int movy[5]={0,1,0,-1};//打表找方向
void dfs(int x,int y){
if(x == fx&& y == fy){
cnt++;return ;//找到了就记录
}
int xx,yy;
for(int i = 0; i <= 3; i ++){
xx = x + movx[i];
yy = y + movy[i];
if(map[xx][yy]==0 && vis[xx][yy]==0 && xx>=1 && xx<=n && yy>=1 && yy<=n){
vis[xx][yy]=1;
dfs(xx,yy);
vis[xx][yy]=0;//回溯
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&t);
scanf("%d %d",&sx,&sy);
scanf("%d %d",&fx,&fy);//输入
vis[sx][sy]=1;// 起点要标记的,因为如果不标记的话后面的答案会访问好几遍这个点
//莫名奇妙多许多解的原因就在此
for(int i = 1; i <= t; i++){
scanf("%d %d",&x,&y);
map[x][y]=1;
}
dfs(sx,sy);
printf("%d\n",cnt);
return 0;
}