3623 - 【搜索与回溯】迷宫问题
时间限制 : 1 秒
内存限制 : 128 MB
设有一个N*N(2<=N<=10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放有0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径,输出路径总数,如果无法到达,则输出0。
题目输入
第一行正整数N,
按下来是N*N的0、1迷宫矩阵,数之间用一个空格分隔。
题目输出
路径总数。
输入/输出样例
输入格式
3 0 0 0 0 1 1 1 0 0
输出格式
2
C++解答
#include<iostream> using namespace std; const int N = 51; int map[N][N],book[N][N]; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int head=1,tail=1; int n,sx,sy,fx,fy,tx,ty,flag; struct queue { int x; int y; int s; }que[2501]; int main() { cin>>n; sx=1;sy=1;fx=1;fy=n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>map[i][j]; que[tail].x=1; que[tail].y=1; que[tail++].s=0; book[sx][sy]=1; flag=0; while(head<tail){ for(int i=0;i<=3;i++){ tx=que[head].x+dir[i][0]; ty=que[head].y+dir[i][1]; if(tx<1||tx>n||ty<1||ty>n) continue; if(map[tx][ty]==0&&book[tx][ty]==0){ book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; que[tail].s=que[head].s+1; tail++; } if(tx==fx&&ty==fy){ flag=1; break; } } if(flag==1) break; head++; } cout<<que[tail-1].s<<endl; return 0; }
Java解答
import java.util.Scanner; //图的搜索和回溯问题 public class Main { static int n; static int sum=0; static int sx[]={-1,-1,-1,0,0,1,1,1}; static int sy[]={-1,0,1,-1,1,-1,0,1}; static int [][]s=new int[15][15];//存储本身 static int [][]a=new int[15][15];//是否访问过标记 public static void main(String[] args) { Scanner scanner=new Scanner(System.in); while(scanner.hasNext()) { n=scanner.nextInt(); sum=0; s=new int[15][15]; a=new int[15][15]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) s[i][j]=scanner.nextInt(); a[0][0]=1;//左上角访问过,置为1; dfs(0,0); System.out.println(sum); } } static void dfs(int x,int y)//起始点x和y { if(x==0&&y==n-1) {//如果达到终点x和y的要求,执行相关操作,本体要求是路径条数 sum++; return ; } for(int i=0;i<8;i++)//依次访问该点周围八个方向 { int nx=x+sx[i]; int ny=y+sy[i]; if(nx>=0&&nx<n&&ny>=0&&ny<n&&s[nx][ny]==0&&a[nx][ny]==0)//前四个为判断是否在迷宫中 最后一个是判断该点是否被访问过 { a[nx][ny]=1; dfs(nx,ny);//是没访问过的点并且是可行点,就继续搜索 a[nx][ny]=0;//回溯,重新置为0,方便下次访问 } } return ; } }