【搜索1】P1605 迷宫
迷宫 【问题描述】
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和
终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫
中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入样例 输出样例
【数据规模】
1≤N,M≤5
题目描述
输入输出格式
输入格式:
【输入】
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点
坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式:
【输出】
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方
案总数。
输入输出样例
输入样例#1: 复制
2 2 1 1 1 2 2 1 2
输出样例#1: 复制
View Code
1
题目思路:
1.用2个数组dx[4],dy[4]的组合表示上下左右四个方向,
2.搜索:从第一个节点开始,依次从它的上,下,左,右,方向开始搜索。如果第一次上可以走到s2,又对s2这个节点进行上下左右的搜索,直到四个方向都走不通,回到上一个节点。在此之中,如果到达了终点则总的次数加1.
3.终点:第一个节点的所有方向的路径都被试探过则结束。
伪代码模板:
dfs(int k){
if(已经到达这个点){
路径数+1;
for(四个方向都要遍历){
if(可以向下走){
先标记下一个方向d(k+1)被走过;
dfs(下一个点);
恢复下一个方向d(k+1);//因为在dfs遍历完一个方向后,应该继续遍历当前节点的其他方向
}
}
}
实现代码:
1 2 #include<iostream> 3 using namespace std; 4 int a[100][100]; 5 int n,m,f, x0,y0,x1,y1; 6 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; 7 int s=0; 8 void dfs(int x,int y){ 9 if(x==x1&&y==y1){ 10 s++; 11 return ; 12 } 13 for(int i=0;i<=3;i++){ 14 int z=x+dx[i]; 15 int w=y+dy[i]; 16 // cout<<"i"<<i<<endl; 17 if(a[z][w]==0&& z<=n&&z>=1 &&w<=m && w>=1){ 18 a[z][w]=1; 19 // cout<<z<<" "<<w<<endl; 20 dfs(z,w); 21 a[z][w]=0; 22 } 23 } 24 25 26 27 28 } 29 int main(){ 30 31 cin>>n>>m>>f;//行列 32 int i,j; 33 34 for(i=1;i<=n;i++){ 35 for(j=1;j<=m;j++){ 36 a[i][j]=0; 37 } 38 } 39 40 cin>>x0>>y0>>x1>>y1; 41 a[x0][y0]=1; 42 int x2,y2; 43 while(f--){ 44 cin>>x2>>y2; 45 a[x2][y2]=1; 46 } 47 dfs(x0,y0); 48 49 cout<<s<<endl; 50 51 return 0; 52 } 53