ZTE-中兴捧月-北京线下测试赛--A题
魔井
题目:如下图所示一个魔井,魔井由32块格子组成,每个格子有一种颜色,一共有四种颜色,每种颜色有8块格子。而魔井的上的格子是可以移动的,他们可以沿着A、B、C、D、E、F、G、H八个方向移动,比如向A移动一步,那么方块1将移动到该列的最后,其余方块依次向上移动一格。现在要移动魔井,使它“开启”,即中间的八个方块10、11、12、16、17、21、22、23的颜色相同,如下图,我们需要移动以下步骤:D,F,就可以使中间的八个方块的颜色均为黄色。现在输入的魔井,要找出使之“开启”的最少的移动步骤,程序需要输出中间八个格子的颜色,同时输出移动的步骤。
输入:
魔井的每种颜色用数字来标识,1代表绿色,2代表红色、3代表蓝色、4代表黄色,输入为一行数字,数字从上到下,从左到右(如图中1-32的顺序)依次代表一个方块
下图可标识为:
1 2 3 1 4 1 2 1 3 4 4 4 3 2 2 4 4 1 3 1 4 4 3 2 2 2 3 3 1 3 1 2
输出:
输出第一行为中间方格的颜色,第二行输出走过的步骤,如下:
4
DF
思路:采用层序遍历(效率很低),从初始状态出发,分别可以向八个方向移动一步,然后再遍历这方格方向的下一步的移动,遍历时判断中间方格的颜色是否满足要求,满足了就中断遍历,输出结果。
代码用一个结构体来存储每个树节点,有三个成员int型数组,用来存储32个方格的颜色,int level用来标识层序,char型数组用来存储经过的步骤。用一个队列来存储要遍历的节点,当遍历一个节点时,如果该节点不满足要求,就把它的子节点全部入列
代码:
1 #include <stdio.h> 2 #include <queue> 3 #include <memory> 4 struct Node{ 5 char color[33]; 6 int level; 7 char ans[100]; 8 }; 9 10 bool panduan(Node temp){ 11 int a[8],i=0,j=0; 12 a[0]=temp.color[10]; 13 a[1]=temp.color[11]; 14 a[2]=temp.color[12]; 15 a[3]=temp.color[16]; 16 a[4]=temp.color[17]; 17 a[5]=temp.color[21]; 18 a[6]=temp.color[22]; 19 a[7]=temp.color[23]; 20 for (i=0;i<8;i++) 21 { 22 for (j=i;j<8;j++) 23 { 24 if (a[i]!=a[j]) 25 return false; 26 } 27 } 28 return true; 29 } 30 31 32 void main(){ 33 freopen("test.txt","r",stdin); 34 freopen("out.txt","w",stdout); 35 int i; 36 Node first,temp,temp2; 37 memset(&first,0,sizeof(first)); 38 memset(&temp,0,sizeof(temp)); 39 memset(&temp2,0,sizeof(temp2)); 40 for (i=1;i<33;i++) 41 { 42 scanf("%d",&first.color[i]); 43 getchar(); 44 } 45 46 first.level=0; 47 std::queue<Node> q; 48 if(panduan(first)){ 49 temp2=first; 50 } 51 q.push(first); 52 while (!q.empty()) 53 { 54 temp=q.front(); 55 q.pop(); 56 //A 57 memcpy(&temp2,&temp,sizeof(temp)); 58 temp2.color[1]=temp.color[3]; 59 temp2.color[3]=temp.color[5]; 60 temp2.color[5]=temp.color[10]; 61 temp2.color[10]=temp.color[16]; 62 temp2.color[16]=temp.color[21]; 63 temp2.color[21]=temp.color[27]; 64 temp2.color[27]=temp.color[29]; 65 temp2.color[29]=temp.color[31]; 66 temp2.color[31]=temp.color[1]; 67 temp2.ans[temp2.level]='A'; 68 temp2.level+=1; 69 if(panduan(temp2)){ 70 break; 71 } 72 else 73 q.push(temp2); 74 //B 75 memcpy(&temp2,&temp,sizeof(temp)); 76 temp2.color[2]=temp.color[4]; 77 temp2.color[4]=temp.color[6]; 78 temp2.color[6]=temp.color[12]; 79 temp2.color[12]=temp.color[17]; 80 temp2.color[17]=temp.color[23]; 81 temp2.color[23]=temp.color[28]; 82 temp2.color[28]=temp.color[30]; 83 temp2.color[30]=temp.color[32]; 84 temp2.color[32]=temp.color[2]; 85 temp2.ans[temp2.level]='B'; 86 temp2.level+=1; 87 if(panduan(temp2)){ 88 break; 89 } 90 else 91 q.push(temp2); 92 //C 93 memcpy(&temp2,&temp,sizeof(temp)); 94 temp2.color[7]=temp.color[15]; 95 temp2.color[8]=temp.color[7]; 96 temp2.color[9]=temp.color[8]; 97 temp2.color[10]=temp.color[9]; 98 temp2.color[11]=temp.color[10]; 99 temp2.color[12]=temp.color[11]; 100 temp2.color[13]=temp.color[12]; 101 temp2.color[14]=temp.color[13]; 102 temp2.color[15]=temp.color[14]; 103 temp2.ans[temp2.level]='C'; 104 temp2.level+=1; 105 if(panduan(temp2)){ 106 break; 107 } 108 else 109 q.push(temp2); 110 //D 111 memcpy(&temp2,&temp,sizeof(temp)); 112 temp2.color[18]=temp.color[26]; 113 temp2.color[19]=temp.color[18]; 114 temp2.color[20]=temp.color[19]; 115 temp2.color[21]=temp.color[20]; 116 temp2.color[22]=temp.color[21]; 117 temp2.color[23]=temp.color[22]; 118 temp2.color[24]=temp.color[23]; 119 temp2.color[25]=temp.color[24]; 120 temp2.color[26]=temp.color[25]; 121 temp2.ans[temp2.level]='D'; 122 temp2.level+=1; 123 if(panduan(temp2)){ 124 break; 125 } 126 else 127 q.push(temp2); 128 //E 129 memcpy(&temp2,&temp,sizeof(temp)); 130 temp2.color[2]=temp.color[32]; 131 temp2.color[4]=temp.color[2]; 132 temp2.color[6]=temp.color[4]; 133 temp2.color[12]=temp.color[6]; 134 temp2.color[17]=temp.color[12]; 135 temp2.color[23]=temp.color[17]; 136 temp2.color[28]=temp.color[23]; 137 temp2.color[30]=temp.color[28]; 138 temp2.color[32]=temp.color[30]; 139 temp2.ans[temp2.level]='E'; 140 temp2.level+=1; 141 if(panduan(temp2)){ 142 break; 143 } 144 else 145 q.push(temp2); 146 //F 147 memcpy(&temp2,&temp,sizeof(temp)); 148 temp2.color[1]=temp.color[31]; 149 temp2.color[3]=temp.color[1]; 150 temp2.color[5]=temp.color[3]; 151 temp2.color[10]=temp.color[5]; 152 temp2.color[16]=temp.color[10]; 153 temp2.color[21]=temp.color[16]; 154 temp2.color[27]=temp.color[21]; 155 temp2.color[29]=temp.color[27]; 156 temp2.color[31]=temp.color[29]; 157 temp2.ans[temp2.level]='F'; 158 temp2.level+=1; 159 if(panduan(temp2)){ 160 break; 161 } 162 else 163 q.push(temp2); 164 //G 165 memcpy(&temp2,&temp,sizeof(temp)); 166 temp2.color[18]=temp.color[19]; 167 temp2.color[19]=temp.color[20]; 168 temp2.color[20]=temp.color[21]; 169 temp2.color[21]=temp.color[22]; 170 temp2.color[22]=temp.color[23]; 171 temp2.color[23]=temp.color[24]; 172 temp2.color[24]=temp.color[25]; 173 temp2.color[25]=temp.color[26]; 174 temp2.color[26]=temp.color[18]; 175 temp2.ans[temp2.level]='G'; 176 temp2.level+=1; 177 if(panduan(temp2)){ 178 break; 179 } 180 else 181 q.push(temp2); 182 //H 183 memcpy(&temp2,&temp,sizeof(temp)); 184 temp2.color[7]=temp.color[8]; 185 temp2.color[8]=temp.color[9]; 186 temp2.color[9]=temp.color[10]; 187 temp2.color[10]=temp.color[11]; 188 temp2.color[11]=temp.color[12]; 189 temp2.color[12]=temp.color[13]; 190 temp2.color[13]=temp.color[14]; 191 temp2.color[14]=temp.color[15]; 192 temp2.color[15]=temp.color[7]; 193 temp2.ans[temp2.level]='H'; 194 temp2.level+=1; 195 if(panduan(temp2)){ 196 break; 197 } 198 else 199 q.push(temp2); 200 } 201 printf("%d\n",temp2.color[10]); 202 for (i=0;i<temp2.level;i++) 203 { 204 printf("%c",temp2.ans[i]); 205 } 206 207 }