zoukankan      html  css  js  c++  java
  • 7-12 The Rotation Game IDA*

    状态搜索题目  一开始打算用bfs  但是图给的不是矩形图  有点难以下手

    参考了 lrj    将图上所有的点进行标号  直接一个一维数组就解决了图的问题  并且明确了每个点的标号  处理起来十分方便   可见处理不规则图一定要标号解决   之前的万圣节的早晨也是进行标号处理   

    用IDA* 十分快   

    启发方程为  d+h()<maxx   显然一次变动最多只改变了中心的一个格子  最多使得 多一个数字填充完毕

    很有价值的状态搜索题目

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1000
    int a[25];
    int rev[8]={5,4,7,6,1,0,3,2};
    int center[8]={6,7,8,11,12,15,16,17};
    int line[8][7]={
      { 0, 2, 6,11,15,20,22}, // A
      { 1, 3, 8,12,17,21,23}, // B
      {10, 9, 8, 7, 6, 5, 4}, // C
      {19,18,17,16,15,14,13}, // D
    };
    
    int judge(void)
    {
        for(int i=0;i<8;i++)
          if(a[ center[i] ]!=a[ center[0] ])return 0;
        return 1;
    }
    
    void change(int x)
    {
        int temp=a[ line[x][0] ];
        for(int i=0;i<6;i++)
          a[ line[x][i] ]=a[ line[x][i+1] ];
          a[ line[x][6] ]=temp;
    }
    
    int differ(int x)
    {
        int n=0;
        for(int i=0;i<8;i++)
          if(a[ center[i] ]!=x)n++;
          return n;
    }
    
    int h(void)
    {
        return min(differ(1),min(differ(2),differ(3)));
    }
    
    char ans[N];
    bool dfs(int d,int maxx)
    {
        if(judge())
        {
            ans[d]='';
            printf("%s
    ",ans);
            return true;
        }
        if( d+h() >maxx)return false;
        for(int i=0;i<8;i++)
        {
            ans[d]=i+'A';
            change(i);
            if(dfs(d+1,maxx))return true;
            change( rev[i] );
        }
      return false;
    }
    
    void solve(void)
    {
        if(judge()){printf("No moves needed
    ");}
        else 
            for(int maxx=1;;maxx++)
            if(dfs(0,maxx))break;
        printf("%d
    ",a[6]);
        return ;
    }
    
    int main()
    {
        for(int i=4;i<=7;i++)
            for(int j=0;j<7;j++)
               line[i][j]= line[ rev[i] ][6-j];
               
        while(scanf("%d",&a[0]),a[0])
        {
            for(int i=1;i<=23;i++)scanf("%d",&a[i]);
            solve();
        }
    }
  • 相关阅读:
    CodeForces 1208 A. Boys and Girls 模拟序列
    CodeForces 1209 B. Jury Size 树状数组处理区间统计问题
    Linux环境进程间通信(转IBM)
    Qt(转IBM)
    POSIX 线程详解(转IBM)
    Perl 编程系列
    Socket in Linux(转IBM)
    Return to the Basic 限定符: const和volatile.
    SQA
    (C++)从本机获取WMI数据.
  • 原文地址:https://www.cnblogs.com/bxd123/p/10411664.html
Copyright © 2011-2022 走看看