hdu1195: Open the Lock

hdu1195: http://acm.hdu.edu.cn/showproblem.php?pid=1195
题意:求解密最少步骤:密码为四位数,每次操作可将一个数加一或减一(1减一变为9,9加一变为1),也可互换相邻数字,求最少需要多少操作数能解密 解法:bfs:加一减一和交换位置都属于状态转移
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int q[1000*1000][4],v[4],key[4],dis[10][10][10][10],an1[4],bn1[4],cn1[4],dn1[4],an2[4],bn2[4],cn2[4],dn2[4],an[4],bn[4],cn[4],dn[4];
const int inf=1<<29;
int main()
{
    int t,i,j,rear,front,a,b,c,d,tt,ttt;
    scanf("%d",&t);
    while(t--)
    {
        for(i=0;i<=9;i++)
        for(j=0;j<=9;j++)
        for(int x=0;x<=9;x++)
        for(int y=0;y<=9;y++)
        dis[i][j][x][y]=inf;
        rear=0;front=0;
        scanf("%d",&tt);
        for(j=3;j>=0;j--)
        {
            v[j]=tt%10;
            q[rear][j]=v[j];
            tt=tt/10;
        }
        rear++;
        dis[v[0]][v[1]][v[2]][v[3]]=0;
        scanf("%d",&ttt);
        for(j=3;j>=0;j--)
        {
            key[j]=ttt%10;
            ttt=ttt/10;
        }
        getchar();
        while(rear>front)
        {
            a=q[front][0];b=q[front][1];c=q[front][2];d=q[front++][3];
            for(i=0;i<4;i++)
            {
                if(i==0)
                {
                    if(a==1)
                    {
                        an1[0]=9;bn1[0]=b;cn1[0]=c;dn1[0]=d;
                        an2[0]=2;bn2[0]=b;cn2[0]=c;dn2[0]=d;
                    }
                    else if(a==9)
                    {
                        an1[0]=1;bn1[0]=b;cn1[0]=c;dn1[0]=d;
                        an2[0]=8;bn2[0]=b;cn2[0]=c;dn2[0]=d;
                    }
                    else
                    {
                        an1[0]=a-1;bn1[0]=b;cn1[0]=c;dn1[0]=d;
                        an2[0]=a+1;bn2[0]=b;cn2[0]=c;dn2[0]=d;
                    }
                }
                if(i==1)
                {
                    if(b==1)
                    {
                        an1[1]=a;bn1[1]=9;cn1[1]=c;dn1[1]=d;
                        an2[1]=a;bn2[1]=2;cn2[1]=c;dn2[1]=d;
                    }
                    else if(b==9)
                    {
                        an1[1]=a;bn1[1]=1;cn1[1]=c;dn1[1]=d;
                        an2[1]=a;bn2[1]=8;cn2[1]=c;dn2[1]=d;
                    }
                    else
                    {
                        an1[1]=a;bn1[1]=b-1;cn1[1]=c;dn1[1]=d;
                        an2[1]=a;bn2[1]=b+1;cn2[1]=c;dn2[1]=d;
                    }
                }
                if(i==2)
                {
                    if(c==1)
                    {
                        an1[2]=a;bn1[2]=b;cn1[2]=9;dn1[2]=d;
                        an2[2]=a;bn2[2]=b;cn2[2]=2;dn2[2]=d;
                    }
                    else if(c==9)
                    {
                        an1[2]=a;bn1[2]=b;cn1[2]=1;dn1[2]=d;
                        an2[2]=a;bn2[2]=b;cn2[2]=8;dn2[2]=d;
                    }
                    else
                    {
                        an1[2]=a;bn1[2]=b;cn1[2]=c-1;dn1[2]=d;
                        an2[2]=a;bn2[2]=b;cn2[2]=c+1;dn2[2]=d;
                    }
                }
                if(i==3)
                {
                    if(d==1)
                    {
                        an1[3]=a;bn1[3]=b;cn1[3]=c;dn1[3]=9;
                        an2[3]=a;bn2[3]=b;cn2[3]=c;dn2[3]=2;
                    }
                    else if(d==9)
                    {
                        an1[3]=a;bn1[3]=b;cn1[3]=c;dn1[3]=1;
                        an2[3]=a;bn2[3]=b;cn2[3]=c;dn2[3]=8;
                    }
                    else
                    {
                        an1[3]=a;bn1[3]=b;cn1[3]=c;dn1[3]=d-1;
                        an2[3]=a;bn2[3]=b;cn2[3]=c;dn2[3]=d+1;
                    }
                }
                if(dis[an1[i]][bn1[i]][cn1[i]][dn1[i]]>dis[a][b][c][d]+1)
                {
                    dis[an1[i]][bn1[i]][cn1[i]][dn1[i]]=dis[a][b][c][d]+1;
                    q[rear][0]=an1[i];q[rear][1]=bn1[i];q[rear][2]=cn1[i];q[rear++][3]=dn1[i];
                }
                if(dis[an2[i]][bn2[i]][cn2[i]][dn2[i]]>dis[a][b][c][d]+1)
                {
                    dis[an2[i]][bn2[i]][cn2[i]][dn2[i]]=dis[a][b][c][d]+1;
                    q[rear][0]=an2[i];q[rear][1]=bn2[i];q[rear][2]=cn2[i];q[rear++][3]=dn2[i];
                }
            }
            an[0]=b;bn[0]=a;cn[0]=c;dn[0]=d;
            an[1]=a;bn[1]=c;cn[1]=b;dn[1]=d;
            an[2]=a;bn[2]=b;cn[2]=d;dn[2]=c;
            for(i=0;i<3;i++)
            {
                if(dis[an[i]][bn[i]][cn[i]][dn[i]]>dis[a][b][c][d]+1)
                {
                    dis[an[i]][bn[i]][cn[i]][dn[i]]=dis[a][b][c][d]+1;
                    q[rear][0]=an[i];q[rear][1]=bn[i];q[rear][2]=cn[i];q[rear++][3]=dn[i];
                }
            }
        }
        printf("%d\n",dis[key[0]][key[1]][key[2]][key[3]]);
    }
}
/*
input:
2
1234
2144

1111
9999

output:
2
4
*/

转载于:https://www.cnblogs.com/acmjun/archive/2012/07/25/2608591.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值