1.前言
= =
感觉自己其实没发过关于考试的博客过...
今天是一个平安的夜晚,漆黑的夜被霓虹划分成网络,很适合发题。
2.num9九数码问题
传统8数码改一下...只询问一个状态,所以很容易搞,正向广搜即可。
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int maxn=362880+10; int ans[9]; int level[9]; int a[maxn][9]; int que[maxn],rec[maxn],pre[maxn]; int Hash[maxn]; int get_h(int a[]){ int sum=0,cnt; for(int i=0;i<9;i++){ cnt=0; for(int j=i+1;j<9;j++) if(a[j]<a[i]) cnt++; sum+=cnt*level[8-i]; } return sum; } void change1(int L[],int N[]){ N[0]=L[3],N[1]=L[0],N[2]=L[1]; N[3]=L[6],N[4]=L[4],N[5]=L[2]; N[6]=L[7],N[7]=L[8],N[8]=L[5]; } void change2(int L[],int N[]){ N[0]=L[0],N[1]=L[1],N[2]=L[2]; N[3]=L[5],N[4]=L[3],N[5]=L[4]; N[6]=L[6],N[7]=L[7],N[8]=L[8]; } void print(int a[]){ printf("%d %d %d\n%d %d %d\n%d %d %d\n\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]); } void dfs(int p){ if(!p) return; dfs(pre[p]); print(a[p]); } void BFS(){ int H=0,T=2,key; pre[1]=0;key=get_h(a[1]);Hash[key]=1;que[1]=key; while(H+1<T){ H++; change1(a[H],a[T]); key=get_h(a[T]); if(!Hash[key]){ Hash[key]=Hash[que[H]]+1,que[T]=key,rec[key]=T,pre[T]=H,T++; if(!key){ int p=T-1; printf("%d\n",Hash[0]-1); dfs(p); return ; } } change2(a[H],a[T]); key=get_h(a[T]); if(!Hash[key]){ Hash[key]=Hash[que[H]]+1,que[T]=key,rec[key]=T,pre[T]=H,T++; if(!key){ int p=T-1; printf("%d\n",Hash[0]-1); dfs(p); return ; } } } printf("UNSOLVABLE"); } int main(){ freopen("num9.in","r",stdin); freopen("num9.out","w",stdout); level[0]=1; for(int i=1;i<=9;i++) level[i]=level[i-1]*i; for(int i=0;i<9;i++) scanf("%d",&a[1][i]); BFS(); return 0; }