pc^2 比赛 H Bounce by Hyoga

本文介绍了一种使用暴力迭代加深搜索算法解决迷宫问题的方法,通过设置结束条件和状态转移来找到从起点到终点的路径,确保至少重复两次路径。代码示例包含了迷宫地图的输入读取、搜索逻辑实现以及最终结果输出。

暴力的迭代加深搜索即可。12ms无语了……

注意别都错或读露题目。

1.结束点在第一行开始点的右边即可

2.至少重复两次

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int d1x[]={-1,-1,1,1,0,0};
const int d1y[]={0,1,0,1,-1,1};
const int d0x[]={-1,-1,1,1,0,0};
const int d0y[]={0,-1,0,-1,-1,1};
char a[10][10];
char ans[100],tmp[100];
bool vis[10][10];
bool solve;
int r,c,n,y0;
bool check(int i,int j)
{
    return ((i%2==1)&&(1<=j)&&(j<=c))||((i%2==0)&&(1<=j)&&(j<=c+1));
}
bool dfs(int x,int y,int step,int limit,bool al)
{
    if(solve)return true;
    //
    if(x==r)al=true;
    //cut
    if(step>n && tmp[step]!=tmp[step-n])return false;//1
    if(al)//2
    {
        if(step+x-1>limit)return false;
    }
    else
    {
        if(step+r-x+r-1>limit)return false;
    }
    //final
    if(step==limit)
    {
        if(al && y>y0 && x==1)
        {
            for(int i=1;i<=limit;i++)
            ans[i]=tmp[i];
            ans[limit+1]='\0';
            solve=true;
            return true;
        }
        return false;
    }
    //dfs
    if(x%2==1)
    {
        for(int i=0;i<=5;i++)
        {
            int xx=x+d1x[i],yy=y+d1y[i];
            if(check(xx,yy)&&!vis[xx][yy])
            {
                vis[xx][yy]=true;
                tmp[step+1]=a[xx][yy];
                dfs(xx,yy,step+1,limit,al);
                vis[xx][yy]=false;
            }
        }
    }
    else
    {
        for(int i=0;i<=5;i++)
        {
            int xx=x+d0x[i],yy=y+d0y[i];
            if(check(xx,yy)&&!vis[xx][yy])
            {
                vis[xx][yy]=true;
                tmp[step+1]=a[xx][yy];
                dfs(xx,yy,step+1,limit,al);
                vis[xx][yy]=false;
            }
        }
    }
    if(solve)return true;else return false;
}
int main()
{
    //freopen("data","r",stdin);
    while(scanf("%d",&r),r)
    {
        scanf("%d%d",&c,&n);
        int tot=0;
        for(int i=1;i<=r;i++)
        {
            char s[3];
            for(int j=1;j<=c+(i%2==0);j++)
            {
                tot++;
                scanf("%s",s);
                a[i][j]=s[0];
            }
        }

        solve=false;
        for(int i=2*n;i<=tot;i+=n)
        {
            for(y0=1;y0<=c;y0++)
            {
                memset(vis,false,sizeof(vis));
                tmp[1]=a[1][y0];
                vis[1][y0]=true;
                dfs(1,y0,1,i,false);
                if(solve)break;
            }
            if(solve)break;
        }

        if(!solve)
            printf("no solution\n");
        else
            printf("%s\n",ans+1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值