【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

HDU1195 BFS或者DP

原创 2016年06月01日 00:10:08

Open the Lock

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5936    Accepted Submission(s): 2651


Problem Description
Now an emergent task for you is to open a password lock. The password is consisted of four digits. Each digit is numbered from 1 to 9.
Each time, you can add or minus 1 to any digit. When add 1 to '9', the digit will change to be '1' and when minus 1 to '1', the digit will change to be '9'. You can also exchange the digit with its neighbor. Each action will take one step.

Now your task is to use minimal steps to open the lock.

Note: The leftmost digit is not the neighbor of the rightmost digit.
 

Input
The input file begins with an integer T, indicating the number of test cases.

Each test case begins with a four digit N, indicating the initial state of the password lock. Then followed a line with anotther four dight M, indicating the password which can open the lock. There is one blank line after each test case.
 

Output
For each test case, print the minimal steps in one line.
 

Sample Input
2 1234 2144 1111 9999
 

Sample Output
2
4

每个点由四种状态,加1减1,和左边交换或者和右边交换。可以用搜索的来查询每种操作。
要求代价最小可以近似的理解为寻找最短路,那么很自然的选择用BFS来做。
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
int s1,s2,s3,s4;
int e1,e2,e3,e4;
int steps;
bool vis[10000];
struct Q
{
    int x[4];
    int steps;
};
void bfs()
{
    queue<Q>q;
    Q temp,now;
    int i,j;
    int x[4];
    int bit[4]={1000,100,10,1};

    while(!q.empty())q.pop();
    temp.x[0]=s1; temp.x[1]=s2;
    temp.x[2]=s3; temp.x[3]=s4;
    temp.steps=0;
    q.push(temp);
    steps=0xfffffff;
    memset(vis,0,sizeof(vis));
    vis[s1*1000+s2*100+s3*10+s4]=1;
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.x[0]==e1&&now.x[1]==e2&&now.x[2]==e3&&now.x[3]==e4)
        {

            if(steps>now.steps)
            {
                steps=now.steps;
            }
        }
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                x[0]=now.x[0];x[1]=now.x[1];
                x[2]=now.x[2];x[3]=now.x[3];
                temp=now;
                if(j==0)
                {
                    x[i]++;
                    if(x[i]>9)x[i]=1;
                }
                else
                if(j==1)
                {
                    x[i]--;
                    if(x[i]<1)x[i]=9;
                }
                else
                if(j==2)
                {
                    if(i<=0)continue;
                    int t=x[i];
                    x[i]=x[i-1];
                    x[i-1]=t;
                }
                else
                {
                    if(i>=3)continue;
                    int t=x[i];
                    x[i]=x[i+1];
                    x[i+1]=t;
                }
                //printf("%d %d %d %d\n",x[0],x[1],x[2],x[3]);
                if(vis[x[0]*bit[0]+x[1]*bit[1]+x[2]*bit[2]+x[3]*bit[3]])continue;
                vis[x[0]*bit[0]+x[1]*bit[1]+x[2]*bit[2]+x[3]*bit[3]]=1;
                temp.x[0]=x[0];temp.x[1]=x[1];temp.x[2]=x[2];temp.x[3]=x[3];

                temp.steps++;
                q.push(temp);
            }
        }
    }
    return;
}

int main()
{
    int t;
    char str[5];

    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
        s1=str[0]-'0'; s2=str[1]-'0';
        s3=str[2]-'0'; s4=str[3]-'0';
        scanf("%s",str);
        e1=str[0]-'0'; e2=str[1]-'0';
        e3=str[2]-'0'; e4=str[3]-'0';
        bfs();
        printf("%d\n",steps);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

HDU 3651 A Simple Problem (DP 记忆化搜索 或者 bfs)

HDU 3651 A Simple Problem (DP 记忆化搜索 或者 bfs) 题目大意: 你的左右手指一开始分别在5,6位置,现在要按顺序按出给定的数字,至少要几步? 要求: (1)左手始终...

PKU Online Judge POJ流传最广的分类,希望以后会切之(转)

转自 [url]http://bbs.pediy.com/showthread.php?t=123253[/url] 多版本的POJ分类 ­ 流传最广的一种分类: ­ 初期: ­ 一.基本算法: ­ (1)枚举. (poj1753,poj2965) ­ (2)贪心(poj1328,poj2109,poj2586) ­ (3)递归和分治法. ­ (4)递推. ­ (5)构造法.(poj3295) ­ (6)模拟法.(poj1068,poj2632,poj1573,poj29

BFS小结(持续更新中)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 刚好yobobobo...

ACM/ICPC HDU 1195

本年度还有8篇博客需要完成 开篇前附加一个看完《盗梦空间》的我的假设 这假设和薛定谔的猫处于半死半活的叠加态感觉有点像 [code="java"] 世界全都是我做的梦 1:因为世界中的任何一个人“你”,不能对我证明“你”是有意识的还是只是我的虚构。 2:“你”是有意识还是虚构只能由你自己证明 [/code] 这是我的某一篇论坛回复 原题是hdu的1195;题目是英文的,大意我翻译一下。 [code="java"] 有一个紧急开启密码锁的任务。密码由四位数字组成;每个数字从1到9;每次,可以对每一个数字进行加1或者减1;当从1加到9时,由9再加1会变为1;当从9减到
  • leon_a
  • leon_a
  • 2010-09-06 10:37
  • 1199

[bfs]hdoj 1195

题意      问从第一个状态转移到第二个状态需要至少几步   思路     按照题意bfs一遍即可   #include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cstdio&gt; #include&lt;queue&gt; using

BFS小结

刚好yobobobo最近做BFS,我也被渲染了,当是复习一下,也总结一下吧,大部分是HDOJ上的BFS题目,由于本人时间有限,会持续更新 HDU 1548 http://acm.hdu....
  • Xwxcy
  • Xwxcy
  • 2015-12-09 19:25
  • 222

hdu 4885 TIANKENG’s travel(bfs)

<a target="_blank" href="http://acm.hdu.ed

使用Node.js完成的第一个项目的实践总结

第一个Node.js项目总结,使用的modules分享,前端组件分享,异常处理等纯干货!

hdu 1195 Open the Lock

挺好的一道题目,双向bfs的题目,也能单向bfs写。不过双向写的代码太恶心了......还是因为不熟悉 题目大意:给出原密码和准确密码,对于原密码每次可以进行三个操作: 1:任意一位+1 且9+1=1 2:任意一位-1 且1-1=9 3:相邻两位互换,且首位和末位不是相邻的。 (密码只有四位数,每个数字1-9) 题目要求原密码变成准确密码的最少步数 单向bfs: #include &lt;iostream&gt; #incl

hdu与poj题目分类

POJ初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法....
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)