【判重+广搜(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)