poj3984(DFS写法) 迷宫路径问题

来源:互联网 发布:r语言金融数据分析 编辑:程序博客网 时间:2024/04/29 07:53
迷宫问题
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6113 Accepted: 3540

Description

定义一个二维数组:
int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0

Sample Output

(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)接着上一遍博客说,上一篇用了BFS,由于本题数据量比较小,用两种方法差不多,主要是训练一下两种搜索方式的思想和写法,注意DFS要回溯,要恢复变量的原状态。
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <ctime>#include <queue>#include <stack>#include <vector>#include <algorithm>#include <string>using namespace std;#define forl(i,a,b)  for(int i=(a);i<(b);++i)#define forle(i,a,b) for(int i=(a);i<=(b);++i)#define forg(i,a,b)  for(int i=(a);i>(b);--i)#define forge(i,a,b) for(int i=(a);i>=(b);--i)#define mes(a,v)  memset(a, v, sizeof (a) );#define cpy(a,b)  memcpy(a, b, sizeof (a) );#define mesn(a, v, n) memset(a, v, (n)*sizeof((a)[0]))#define cpyn(a, b, n) memcpy(a, v, (n)*sizeof((a)[0]))const int dx[]={1,0,0,-1};const int dy[]={0,1,-1,0};int maze[10][10],visit[10][10];struct Node{    int x,y;};vector<Node>v;bool Dfs(int x,int y){    Node tmp;    tmp.x=x,tmp.y=y;    v.push_back(tmp);    visit[x][y]=1;    if(x==4&&y==4)  return true;    for(int i=0;i<4;i++)    {        int nex=x+dx[i];        int ney=y+dy[i];        if(!visit[nex][ney]&&!maze[nex][ney]&&nex>=0&&nex<5&&ney>=0&&ney<5)        {            if(Dfs(nex,ney))    return true;            v.pop_back();        //返回原状态            visit[nex][ney]=0;  //返回原状态        }    }    return false;}int main(){    //freopen("in.txt","r",stdin);    int i,j;    for(i=0;i<5;i++)        for(j=0;j<5;j++)            scanf("%d",&maze[i][j]);    Dfs(0,0);    for(i=0;i<v.size();i++)        printf("(%d, %d)\n",v[i].x,v[i].y);    return 0;}


原创粉丝点击