hdu 2782 DFS

本文介绍了一种使用深度优先搜索算法解决迷宫问题的方法,通过递归调用实现路径搜索并记录最优路径。

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

时间4s~~~爆搜~~

#include <cstring>
#include <cstdio>
using namespace std;
int map[700][700];
int vis[700][700];
int ansx,ansy;
int ansd,anssum;
int n,m;
int res=0;
int xx[4]={0,-1,1,0};
int yy[4]={1,0,0,-1};
void dfs(int x,int y,int ans,int pre)
{
    if(pre==-1)
    {
        int i;
        for(i=0;i<4;i++)
        {
            int nx=x+xx[i];
            int ny=y+yy[i];
            if(nx<0||nx>=n||ny<0||ny>=m)
                continue;
            if(vis[nx][ny])
                continue;
            vis[nx][ny]=1;
            dfs(nx,ny,ans+1,i);
            vis[nx][ny]=0;
            if(res>anssum)
            {
                ansx=x;
                ansy=y;
                ansd=i;
                anssum=res;
            }
        }
        return ;
    }
    int i;
    int flag=1;
    int nx=x+xx[pre];
    int ny=y+yy[pre];
    if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nx][ny])
    {
        vis[nx][ny]=1;
        dfs(nx,ny,ans+1,pre);
        vis[nx][ny]=0;
        flag=0;
    }
    else
    {
        for(i=0;i<4;i++)
        {
            if(i==pre)
                continue;
            nx=x+xx[i];
            ny=y+yy[i];
            if(nx<0||nx>=n||ny<0||ny>=m)
                continue;
            if(vis[nx][ny])
                continue;
            vis[nx][ny]=1;
            dfs(nx,ny,ans+1,i);
            vis[nx][ny]=0;
            flag=0;
        }
    }
    if(flag)
    {
        if(res<ans)
            res=ans;
    }

}
int main()
{
    int cas=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        cas++;
        if(n==0&&m==0)
            break;
        int r;
        scanf("%d",&r);
        int i;
        memset(vis,0,sizeof(vis));
        for(i=0;i<r;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            vis[x][y]=1;
        }
        int j;
        anssum=-1;
        res=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(!vis[i][j])
                {

                    vis[i][j]=1;
                    dfs(i,j,1,-1);
                    vis[i][j]=0;
                }

            }
        }
        printf("Case %d: %d %d %d ",cas,anssum,ansx,ansy);
        if(ansd==0)
            printf("E\n");
        else if(ansd==1)
            printf("N\n");
        else if(ansd==2)
            printf("S\n");
        else if(ansd==3)
            printf("W\n");

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值