首页 > 代码库 > 【判重+广搜(bfs)】魔板

【判重+广搜(bfs)】魔板

判重+广搜(bfs)】魔板

Time Limit: 1000MS
Memory Limit: 32768KB

Special Judge

有一个两行四列的魔板,每个格子里有一个1到8的数字(数字唯一),现在我们可以对魔板进行以下操作:
1.交换两行的数字。
2.将第一列移到第二列,第二列到第三列,第三列到第四列,第四列到第一列。
3.将中间四个数顺时针转一次。
现给你初始状态,我末状态请你用最小的步数将它从初始状态变到末状态。
输入:
前两行,每行4个数表示初状态。
后两行,每行4个数表示末状态。
输出:
第一行一个数,表示最少步数。
接下来每两行一个状态,依次给出从初状态到末状态的过程。
样例:
输入:
1 2 3 4
5 6 7 8
2 3 4 1
6 7 8 5
输出:
3
1 2 3 4
5 6 7 8
4 1 2 3
8 5 6 7
3 4 1 2
7 8 5 6
2 3 4 1
6 7 8 5

Source
class



judge

 1 # include<cstdio> 2 # include<cstring> 3 # include<algorithm> 4 # include<iostream> 5 using namespace std; 6 const int maxn=40000; 7 int map[maxn][3][5],pre[maxn],end[3][5],num[maxn],vis[maxn]; 8 int head=1,tail=1,cur; 9 void init(){10     for(int i=1;i<=2;i++)for(int j=1;j<=4;j++)scanf("%d",&map[1][i][j]);11     for(int i=1;i<=2;i++)for(int j=1;j<=4;j++)scanf("%d",&end[i][j]);12 }13 int check(int head){14     for(int i=1;i<=2;i++)15     for(int j=1;j<=4;j++)16     if(map[head][i][j]!=end[i][j])17     return 0;18     return 1;19 }20 void one(){21     tail++;22     for(int i=1;i<=4;i++)map[tail][1][i]=map[head][2][i];23     for(int i=1;i<=4;i++)map[tail][2][i]=map[head][1][i];24     pre[tail]=head;25     num[tail]=num[head]+1;26 }27 void two(){28     tail++;29     map[tail][1][1]=map[head][1][4];30     map[tail][2][1]=map[head][2][4];31     map[tail][1][2]=map[head][1][1];32     map[tail][2][2]=map[head][2][1];33     map[tail][1][3]=map[head][1][2];34     map[tail][2][3]=map[head][2][2];35     map[tail][1][4]=map[head][1][3];36     map[tail][2][4]=map[head][2][3];37     pre[tail]=head;38     num[tail]=num[head]+1;39 }40 void tree(){41     tail++;42     for(int i=1;i<=2;i++)for(int j=1;j<=4;j++)43     map[tail][i][j]=map[head][i][j];44     map[tail][1][2]=map[head][2][2];45     map[tail][1][3]=map[head][1][2];46     map[tail][2][3]=map[head][1][3];47     map[tail][2][2]=map[head][2][3];48     pre[tail]=head;49     num[tail]=num[head]+1;50 }51 void print(int head){52     printf("%d\n",num[head]);53     for(int i=pre[head];i!=0;i=pre[i])54     vis[++cur]=i;55     for(int i=cur;i>=1;i--)56     for(int j=1;j<=2;j++){57     for(int k=1;k<=4;k++)58     printf("%d ",map[vis[i]][j][k]);59     printf("\n");60     }61     for(int j=1;j<=2;j++){62     for(int k=1;k<=4;k++)63     printf("%d ",end[j][k]);64     printf("\n");65     }66 }67 void bfs(){68     while(head<=tail){69         if(check(head)){70         print(head);71         return;72         }73         one();74         two();75         tree();76         head++;77     }78 }79 int main(){80     init();81     bfs();82     return 0;83 }

 

【判重+广搜(bfs)】魔板