递归入门走迷宫-DFS
Posted yanshaodian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归入门走迷宫-DFS相关的知识,希望对你有一定的参考价值。
题目链接:http://codeup.cn/problem.php?cid=100000608&pid=5
===
这题 初始点标记访问那块一开始弄反了一直提示输出超限,艹坑了我好久啊啊!
1 #include<bits/stdc++.h> 2 using namespace std; 3 int m,n;//m行n列的迷宫 4 int start_x,start_y,end_x,end_y; 5 int map_[20][20]={0}; 6 int flag=0; 7 bool visit[20][20]={false}; 8 int nexto[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//左上右下 9 struct Point{ 10 int x; 11 int y; 12 Point(int c,int d):x(c),y(d){} 13 }; 14 vector<Point>my; 15 void DFS(int x,int y){ 16 int tx=0,ty=0; 17 if(x==end_x&&y==end_y){ 18 flag=1; 19 for(int i=0;i<my.size()-1;i++){ 20 printf("(%d,%d)->",my[i].x,my[i].y);//!不用加 &符号 21 } 22 printf("(%d,%d) ",my[my.size()-1].x,my[my.size()-1].y); 23 return; 24 } 25 for(int i=0;i<4;i++){ 26 tx=x+nexto[i][0]; 27 ty=y+nexto[i][1];//下一步方向 28 if(tx<1||ty<1||tx>m||ty>n||visit[tx][ty]==true) continue;//剪枝 29 if(visit[tx][ty]==false&&map_[tx][ty]==1){ 30 my.push_back(Point(tx,ty)); 31 visit[tx][ty]=true; 32 DFS(tx,ty); 33 visit[tx][ty]=false; 34 my.pop_back();//回溯 35 } 36 } 37 } 38 int main(){ 39 while(scanf("%d %d",&m,&n)!=EOF){ 40 flag=0; 41 my.clear(); 42 memset(map_,0,sizeof(map_)); 43 memset(visit,false,sizeof(visit)); 44 for(int i=1;i<=m;i++){ 45 for(int j=1;j<=n;j++){ 46 scanf("%d",&map_[i][j]);//初始化迷宫 47 } 48 } 49 scanf("%d %d",&start_x,&start_y); 50 //压入初始点 51 my.push_back(Point(start_x,start_y)); 52 scanf("%d %d",&end_x,&end_y); 53 visit[start_x][start_y]=true;//就是这里!!一开始我赋值是false 一直提示输出超限,,,我还寻思我这输入输出有问题??淦- - 54 DFS(start_x,start_y); 55 if(flag==0) printf("-1 "); 56 } 57 return 0; 58 }
以上是关于递归入门走迷宫-DFS的主要内容,如果未能解决你的问题,请参考以下文章