poj 1103 maze源代码

本文介绍了一种用于检测迷宫中是否存在循环的深度优先搜索算法,并详细展示了算法的具体实现过程。该算法通过记录路径和访问状态来判断是否形成循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

using namespace std;
int const MAXN=76;
struct node
{
    int prex,prey,preid;
};
node pre[MAXN][MAXN][2];

char map[MAXN][MAXN];
int visited[MAXN][MAXN][2];
int w,h;
int length;
int path[MAXN][MAXN][2];
int startpath=0;
int vislen;
bool inrange(int x,int y)
{
    if(x>=0&&x<h&&y>=0&&y<w)
         return 1;
    return 0;
}
bool DFS(int sx,int sy,int id)
{
    //cout<<sx<<" "<<sy<<" "<<id<<" "<<path[sx][sy][id]<<endl;
    visited[sx][sy][id]=true;
    vislen++;
    int nx,ny,nid;
    if(map[sx][sy]=='//')
    {
        if(id==0)
        {
            nx=sx;
            ny=sy-1;
            nid=1;
            if(inrange(nx,ny))
            {
               if(!visited[nx][ny][nid])
               {
                   pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                   path[nx][ny][nid]=path[sx][sy][id]+1;
                   if(DFS(nx,ny,nid))
                      return true;
               }
               else
               {
                    if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                   {
                        length=path[sx][sy][id]-path[nx][ny][nid]+1;
                        // cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
                           return true;
                   }
               }
            }
            nx=sx+1;
            ny=sy;
            if(inrange(nx,ny))
            {
                if(map[nx][ny]=='//')
                    nid=1;
                else
                    nid=0;
                    if(!visited[nx][ny][nid])
                    {
                        pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                        path[nx][ny][nid]=path[sx][sy][id]+1;
                        if(DFS(nx,ny,nid))
                           return true;
                    }
                    else
                    {
                       if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                        {
                             length=path[sx][sy][id]-path[nx][ny][nid]+1;
                           // cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
                                return true;
                        }
                    }
            }
        }
        else
        {
            nx=sx;
            ny=sy+1;
            nid=0;
            if(inrange(nx,ny))
            {
                if(!visited[nx][ny][nid])
                {
                  pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                  path[nx][ny][nid]=path[sx][sy][id]+1;
                   if(DFS(nx,ny,nid))
                      return true;
                }
                else
                {
                    if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                   {
                        length=path[sx][sy][id]-path[nx][ny][nid]+1;
                       //cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
                           return true;
                   }
                }
            }
            nx=sx-1;
            ny=sy;
            if(inrange(nx,ny))
            {
                if(map[nx][ny]=='//')
                   nid=0;
                else nid=1;
                if(!visited[nx][ny][nid])
                {
                   pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                  path[nx][ny][nid]=path[sx][sy][id]+1;
                   if(DFS(nx,ny,nid))
                      return true;
                }
                else
                {
                    if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                   {
                        length=path[sx][sy][id]-path[nx][ny][nid]+1;
                        //cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
                           return true;
                   }
                }
            }
        }
    }
    else
    {
        if(id==0)
        {
            nx=sx;
            ny=sy-1;
            nid=1;
             if(inrange(nx,ny))
             {
                if(!visited[nx][ny][nid])
                {
                     pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                    path[nx][ny][nid]=path[sx][sy][id]+1;
                    if(DFS(nx,ny,nid))
                       return true;
                }
                else
                {
                    if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                    {
                          length=path[sx][sy][id]-path[nx][ny][nid]+1;
                           //cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
                            return true;
                    }
                }
             }
             nx=sx-1;
             ny=sy;
             if(inrange(nx,ny))
             {
                 if(map[nx][ny]=='//')
                    nid=0;
                  else nid=1;
                  if(!visited[nx][ny][nid])
                 {
                     pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                    path[nx][ny][nid]=path[sx][sy][id]+1;
                    if(DFS(nx,ny,nid))
                       return true;
                 }
                 else
                 {
                    if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                    {

                          length=path[sx][sy][id]-path[nx][ny][nid]+1;
                         // cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
                            return true;
                    }
                 }
             }
        }
        else
        {
          nx=sx;
          ny=sy+1;
          nid=0;
          if(inrange(nx,ny))
          {
                if(!visited[nx][ny][nid])
                {
                     pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                    path[nx][ny][nid]=path[sx][sy][id]+1;
                    if(DFS(nx,ny,nid))
                       return true;
                }
                else
                {
                    if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                    {
                          length=path[sx][sy][id]-path[nx][ny][nid]+1;
                          //cout<<length<<endl;
                            return true;
                    }
                }
          }
          nx=sx+1;
          ny=sy;
          if(inrange(nx,ny))
          {
              if(map[nx][ny]=='//')
                 nid=1;
              else nid=0;
              if(!visited[nx][ny][nid])
                {
                     pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
                    path[nx][ny][nid]=path[sx][sy][id]+1;
                    if(DFS(nx,ny,nid))
                       return true;
                }
                else
                {
                   if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
                    {
                          length=path[sx][sy][id]-path[nx][ny][nid]+1;
                          //cout<<length<<endl;
                            return true;
                    }
                }
          }
        }
    }
    return false;
}
int main()
{
    freopen("input.txt","r",stdin);
    int cas=1;
   while(cin>>w>>h)
   {
       if(w==0&&h==0)
           break;
        memset(visited,0,sizeof(visited));
        memset(path,-1,sizeof(path));
        memset(pre,-1,sizeof(pre));
        vislen=-1;
        int i,j,k;
        int cycle=0;
        int MAXLEN=0;
        for(i=0;i<h;i++)
           cin>>map[i];
        for(i=0;i<h;i++)
              for(j=0;j<w;j++)
                   for(k=0;k<=1;k++)
                   {
                       length=0;
                       if(!visited[i][j][k])
                       {
                          // cout<<endl;
                           startpath=vislen+1;
                         pre[i][j][k].prex=pre[i][j][k].prey=pre[i][j][k].preid=-1;
                           path[i][j][k]=startpath;
                           if(DFS(i,j,k))
                           {
                               cycle++;
                               if(MAXLEN<length)
                               MAXLEN=length;
                           }
                       }
                   }
         cout<<"Maze #"<<cas++<<":"<<endl;
         if(cycle>0)
         cout<<cycle<<" Cycles; the longest has length "<<MAXLEN<<"."<<endl;
         else cout<<"There are no cycles."<<endl;
         cout<<endl;
   }
    return 0;
}


一款非常好的锁屏APP软件: 酷划, 不仅好用, 而且还能赚钱, 官网地址: http://www.coohua.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值