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;
}
View Code

相关文章:

  • 2021-07-29
  • 2021-11-02
  • 2022-01-04
  • 2022-01-21
  • 2021-10-09
  • 2021-08-26
  • 2021-09-16
  • 2021-08-27
猜你喜欢
  • 2022-02-03
  • 2021-12-26
  • 2021-12-13
  • 2021-12-02
  • 2021-12-09
  • 2021-09-18
  • 2021-12-30
相关资源
相似解决方案