UVa 10422 - Knights in FEN

判断11步能否到达目标状态,类似八数码

用dfs和hash判重做的,居然过了,还是数据量小的原因吧


#include <stdio.h>
#include <string.h>
int f,ans;
char s[30],d[30]={"111110111100 110000100000"};
int k[30],min;
int stex[8] = {-2,2,2,-2,1,1,-1,-1};
int stey[8] = {-1,-1,1,1,2,-2,2,-2};
int hash(char *s)
{
    int sum=0;
    for(int i=0;i<25;i++)
    if(s[i]=='1')sum+=k[i];
    return sum;
}
int dfs(int x,int y,int cur,char *s)
{
    if(s[12]==' '&&hash(s)==ans)
    {
        if(cur<min)min=cur;
        return 0;
    }
    if(cur==10)return 0;
    for(int i=0;i<8;i++)
    {
        if(x+stex[i]>=0&&x+stex[i]<5&&y+stey[i]>=0&&y+stey[i]<5)
        {
         char t=s[x*5+y];
         s[x*5+y]=s[(x+stex[i])*5+y+stey[i]];
         s[(x+stex[i])*5+y+stey[i]]=t;
         dfs(x+stex[i],y+stey[i],cur+1,s);
         t=s[x*5+y];
         s[x*5+y]=s[(x+stex[i])*5+y+stey[i]];
         s[(x+stex[i])*5+y+stey[i]]=t;
        }
    }

}
int main()
{
    k[0]=1;
    for(int i=1;i<25;i++)
    k[i]=k[i-1]*2;
    ans=hash(d);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int p=0,b;
        for(int i=0;i<5;i++)
        {getchar();
            for(int j=0;j<5;j++)
            {scanf("%c",&s[p++]);
            if(s[p-1]==' '){b=p-1;}}

        }
        min=11;
        dfs(b/5,b%5,0,s);
        if(min<11)printf("Solvable in %d move(s).\n",min);
        else printf("Unsolvable in less than 11 move(s).\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值