状态搜索题目 一开始打算用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]='