poj 3984 迷宫问题 dfs 求迷宫路径

题目地址:http://poj.org/problem?id=3984

利用图论中深搜的思想,存在边就是x,y ->  x+1,y  还有x,y -> x,y+1   然后仍然是访问未访问的而且不是墙壁的地方。  这样保证不走已经搜索过,走不通的路。

唯一一种需要重复访问已经访问的结点的情况是已经无路可走了,只能返回,这样就在栈中将路径取出来,把自己现在的那个先pop掉,然后实现回溯。

最后用向量实现栈的自底输出。

代码:

 ID User Problem Result Memory Time Language Code Length Submit Time
12143517 814jingqi 3984 Accepted 720K 0MS G++ 1276B 2013-09-25 17:55:15
12143515 814jingqi 3984 Accepted 184K 0MS C++ 1276B 2013-09-25 17:54:11

可以看到,同一份代码,g++和c++有时差别还是很大的


#include<iostream>
#include<stack>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;



struct  node
{
   int a,b;

};

int maze[7][7];
bool vis[7][7];

stack<node>  passby;

int n;
void init()
{
   memset(vis,0,sizeof(vis));

   for(int i=0;i<7;i++)
    {
       maze[i][0]=1;
       maze[0][i]=1;
       maze[6][i]=1;
       maze[i][6]=1;

    }

}



void dfs(int x,int y)
{

  //  cout<<x<<' '<<y<<endl;
    if(!vis[x][y])     // 如果没有访问过
    {
        node cur;
        cur.a=x;
        cur.b=y;

        vis[x][y]=1;

        passby.push(cur);
    }

    if(x==5&&y==5)   return ;

        if(!vis[x+1][y]&&!maze[x+1][y]) dfs(x+1,y);
        else if(!vis[x][y+1]&&!maze[x][y+1]) dfs(x,y+1);
        else
        {
           passby.pop();
           node cur=passby.top();
           dfs(cur.a,cur.b);
        }

}

int main()
{


   for(int i=1;i<=5;i++)
     for(int j=1;j<=5;j++)
        scanf("%d",&maze[i][j]);

   init();


   dfs(1,1);
   vector<node>  v;
   while(passby.empty()==false)
   {
       v.push_back(passby.top());
       passby.pop();

   }

   for(int i=v.size()-1;i>=0;i--)
   {
       printf("(%d, %d)\n",v[i].a-1,v[i].b-1);

   }
}



posted @ 2013-09-25 18:03  814jingqi  阅读(598)  评论(0编辑  收藏  举报