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();
    }
}
原文地址:https://www.cnblogs.com/bxd123/p/10411664.html