• 【POJ 2286】 The Rotation Game


    【题目链接】

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

    【算法】

               IDA*

    【代码】

                 

    #include <algorithm>
    #include <bitset>
    #include <cctype>
    #include <cerrno>
    #include <clocale>
    #include <cmath>
    #include <complex>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <limits>
    #include <list>
    #include <map>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <utility>
    #include <vector>
    #include <cwchar>
    #include <cwctype>
    #include <stack>
    #include <limits.h>
    using namespace std;
    const int A[7] = {1,3,7,12,16,21,23};
    const int B[7] = {2,4,9,13,18,22,24};
    const int C[7] = {5,6,7,8,9,10,11};
    const int D[7] = {14,15,16,17,18,19,20};
    
    int i,step;
    int a[30];
    char path[100];
    
    inline void print()
    {
            int i;
            for (i = 1; i <= step; i++) printf("%c",path[i]);
            printf("
    %d
    ",a[7]);
    }
    inline int f()
    {
            int i,m;
            int s[10];
            memset(s,0,sizeof(s));
            s[a[7]]++; 
            s[a[8]]++; 
            s[a[9]]++;
            s[a[12]]++;
            s[a[13]]++;
            s[a[16]]++;
            s[a[17]]++;
            s[a[18]]++;
            m = 0;
            for (i = 1; i <= 10; i++) m = max(m,s[i]);
            return 8 - m;
    }
    inline bool check()
    {
            if (a[7] == a[8] && a[8] == a[9] && a[9] == a[12] && a[12] == a[13] && a[13] == a[16] && a[16] == a[17] && a[17] == a[18])
                    return true;
            else return false;
    }
    inline bool IDDFS(int dep)
    {
            int i,tmp;
            int b[30];
            if (dep > step)
            {
                    if (check())
                    {
                            print();
                            return true;        
                    }        
                    else return false;
            }        
            if (dep - 1 + f() > step) return false;
            for (i = 0; i < 7; i++) b[A[i]] = a[A[i]];
            path[dep] = 'A';
            tmp = a[A[0]];
            for (i = 0; i < 6; i++) a[A[i]] = a[A[i+1]];
            a[A[6]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[A[i]] = b[A[i]];
            for (i = 0; i < 7; i++) b[B[i]] = a[B[i]];
            path[dep] = 'B';
            tmp = a[B[0]];
            for (i = 0; i < 6; i++) a[B[i]] = a[B[i+1]];
            a[B[6]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[B[i]] = b[B[i]];
            for (i = 0; i < 7; i++) b[C[i]] = a[C[i]];
            path[dep] = 'C';
            tmp = a[C[6]];
            for (i = 6; i >= 1; i--) a[C[i]] = a[C[i-1]];
            a[C[0]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[C[i]] = b[C[i]];
            for (i = 0; i < 7; i++) b[D[i]] = a[D[i]];
            path[dep] = 'D';
            tmp = a[D[6]];
            for (i = 6; i >= 1; i--) a[D[i]] = a[D[i-1]];
            a[D[0]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[D[i]] = b[D[i]];
            for (i = 0; i < 7; i++) b[B[i]] = a[B[i]];
            path[dep] = 'E';
            tmp = a[B[6]];
            for (i = 6; i >= 1; i--) a[B[i]] = a[B[i-1]];
            a[B[0]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[B[i]] = b[B[i]];
            for (i = 0; i < 7; i++) b[A[i]] = a[A[i]];
            path[dep] = 'F';
            tmp = a[A[6]];
            for (i = 6; i >= 1; i--) a[A[i]] = a[A[i-1]];
            a[A[0]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[A[i]] = b[A[i]];
            for (i = 0; i < 7; i++) b[D[i]] = a[D[i]];
            path[dep] = 'G';
            tmp = a[D[0]];
            for (i = 0; i < 6; i++) a[D[i]] = a[D[i+1]];
            a[D[6]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[D[i]] = b[D[i]];
            for (i = 0; i < 7; i++) b[C[i]] = a[C[i]];
            path[dep] = 'H';
            tmp = a[C[0]];
            for (i = 0; i < 6; i++) a[C[i]] = a[C[i+1]];
            a[C[6]] = tmp;
            if (IDDFS(dep+1))
                    return true;
            for (i = 0; i < 7; i++) a[C[i]] = b[C[i]];
            return false;
    } 
    
    int main() 
    {
            
            while (scanf("%d",&a[1]) && a[1])
            {
                    for (i = 2; i <= 24; i++) scanf("%d",&a[i]);
                    if (check())
                    {
                            printf("No moves needed
    ");
                            printf("%d
    ",a[7]);
                            continue;
                    }
                    for (i = 1; i <= 50; i++)
                    {
                            step = i;
                            if (IDDFS(1)) break;
                    }                
            }
            
            return 0;
        
    }
  • 相关阅读:
    [MyBatis]最简MyBatis工程
    eclipse中如何删除已经添加到 Web App Libraries 中引用的jar包
    day48_项目管理学习笔记
    项目流程之失败的案例
    项目流程之婚礼流程
    day47_Maven学习笔记
    快还要更快,让PHP 7 运行更加神速
    Linux服务器时间同步
    Win10系统开启Linux Bash命令行
    红帽RHOP 8 发布一条龙方案
  • 原文地址:https://www.cnblogs.com/evenbao/p/9281255.html
Copyright © 2020-2023  润新知