UVA - 1343(IDA*(迭代加深搜索)为什么会很快原因待解 )

来源:互联网 发布:局域网共享上网软件 编辑:程序博客网 时间:2024/05/02 03:02
#include <cstdio>#include <cstring>#include <iostream>#include <vector>using namespace std;const int a[8][7]={{ 0, 2,6,11,15,20,22}, //ABCDEFGH  in order 按顺序填写个状态{ 1,3,8,12,17,21,23}, {10, 9,8,7,6,5,4},{19,18,17,16,15,14,13},{23,21,17,12,8,3,1},{22,20,15,11,6,2,0},{13,14,15,16,17,18,19},{4,5,6,7,8,9,10}};const int rev[8]={5,4,7,6,1,0,3,2};const int center[8]={6,7,8,11,12,15,16,17};int st[24],te[24];bool is_goal(){for(int i=0;i<8;i++) if(st[center[i] ]!=st[center[0] ]) return false;return true;}inline void move(int i){int temp=st[a[i][0]];for(int j=0;j<6;j++) st[a[i][j]]=st[a[i][j+1]];st[a[i][6]]=temp;}int diff(int val){int num=0;for(int i=0;i<8;i++) if(st[center[i]]!=val) num++;return num;}inline int h(){return min(min(diff(1),diff(2)),diff(3));}char ans[100],kk;bool dfs(int d,int maxd){if(is_goal()){    ans[kk]='\0'; puts(ans);    printf("%d\n",st[center[0]]);    return true;}if(d+h()>maxd) return false;for(int i=0;i<8;i++){ans[kk++]='A'+i;move(i);if(dfs(d+1,maxd)) return true;move(rev[i]);kk--;}return false;}int main(){    while(scanf("%d",&te[0])&&te[0]){        for(int i=1;i<24;i++){            scanf("%d",&te[i]);        }        int maxd;        for(int i=0;i<24;i++) {st[i]=te[i]; if(te[i]==0)  return 0;}        if(is_goal()) {            printf("No moves needed\n%d\n",te[center[0]]);        }        else {        for(int i=0;i<24;i++) st[i]=te[i];        for(maxd=1;;maxd++){            kk=0;            if(dfs(0,maxd)) break;        }        }    }    return 0;}

0 1
原创粉丝点击