zoukankan      html  css  js  c++  java
  • (广搜)聪明的打字员 -- POJ --1184

    链接:

    http://poj.org/problem?id=1184

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#problem/B   (密码:0817)

    不同的代码风格,这种在搜时有多种选择的,写了函数感觉看着也方便些, 借鉴

    搜索的时候可以去除一些无用的状态,可以发现一个点的值(2-5)如果想要改变那么光标必须在该点处,所以当光标在2-5位置时候,必须要要把值变为与目标位置处一样才可以移动。

    代码:

    #include<stdio.h>
    #include<string.h>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cmath>
    using namespace std;
    #define INF 0x3fffffff
    #define N 205
    bool vis[7][1000001];
    
    struct node
    {
        int step, num, k; ///k代表的是光标所在的位置
        node (int step=0, int num=0, int k=0):step(step), num(num), k(k) {}
    };
    
    
    void GetNum(int A,int c[])
    {
        int k = 6;
        while(k)
        {
            c[k] = A%10;
            A /= 10;
            k--;
        }
    }
    
    node OpNum(int c[], int i, node p)
    {
        if(i==0)
            swap(c[1], c[p.k]);
        else if(i==1)
            swap(c[6], c[p.k]);
        else if(i==2 && c[p.k]!=9)
            c[p.k]++;
        else if(i==3 && c[p.k]!=0)
            c[p.k]--;
        else if(i==4 && p.k!=1)
            p.k--;
        else if(i==5 && p.k!=6)
            p.k++;
    
        int k=1;
        p.step ++;
        p.num = 0;
    
        while(k<=6)
            p.num = p.num * 10 + c[k++];
    
        return p;
    }
    int BFS(int a, int b)
    {
        int c[10], d[10];
        node p, q;
    
        GetNum(b, d);
        memset(vis, false, sizeof(vis));
        vis[1][a] = true;
    
        queue<node>Q;
        Q.push(node(0, a, 1));
    
        while( Q.size() )
        {
            p = Q.front(); Q.pop();
    
            if(p.num==b)  return p.step;
    
            for(int i=0; i<6; i++)
            {
                GetNum(p.num, c);
                if(p.k>=2 && p.k<=5 && (i==4 || i==5) && c[p.k]!=d[p.k]) ///很重要,但我还没理解为什么,等等要问问
                    continue;
    
                q = OpNum(c, i, p);
    
                if(!vis[q.k][q.num])
                {
                    vis[q.k][q.num] = true;
                    Q.push(q);
                }
            }
        }
        return -1;
    }
    
    
    int main()
    {
        int A, B;
        while(scanf("%d%d", &A, &B)!=EOF)
        {
            printf("%d
    ", BFS(A, B));
        }
        return 0;
    }
    勿忘初心
  • 相关阅读:
    HDU 1247
    [转载]亲密接触VC6.0编译器
    [转载]你该学什么程序语言
    ACE学习2009116
    新东方英语学习二
    电脑族吃什么比较好
    爱默生生活的准则
    成大事必备9种能力9种手段9种心态
    [转载]句柄和指针
    关于WM_CREATE消息
  • 原文地址:https://www.cnblogs.com/YY56/p/4739678.html
Copyright © 2011-2022 走看看