1 dfs是深度优先遍历,从一个点从头找到尾,知道找到题目所要求的数目或者无法搜索是会回溯
回溯过后继续寻找,直至找到所有的方案;
2 要根据提议选择是否进行回溯;有的题目是寻找所有能够到达点的个数是不用回溯;
例题
题目描述
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
样例输入
2 2 1 1 1 2 2 1 2
样例输出
#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int x1,x2,y3,y2,s,n,m;
void dfs(int x,int y){
if(x==x2-1&&y==y2-1)s++;
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=0&&xx<n&&yy>=0&&y<m&&a[xx][yy]==0){
a[xx][yy]=1;
dfs(xx,yy);
a[xx][yy]=0;
}
}
}
int main(){
int t;
cin>>n>>m>>t;
scanf("%d%d%d%d",&x1,&y3,&x2,&y2);
while(t--){
int q,w;cin>>q>>w;
a[q-1][w-1]=1;
}
dfs(x1-1,y3-1);
printf("%d",s);
}
1