魔井数组
题目:以下图所示一个魔井,魔井由32块格子组成,每一个格子有一种颜色,一共有四种颜色,每种颜色有8块格子。而魔井的上的格子是能够移动的,他们能够沿着A、B、C、D、E、F、G、H八个方向移动,好比向A移动一步,那么方块1将移动到该列的最后,其他方块依次向上移动一格。如今要移动魔井,使它“开启”,即中间的八个方块十、十一、十二、1六、1七、2一、2二、23的颜色相同,以下图,咱们须要移动如下步骤:D,F,就可使中间的八个方块的颜色均为黄色。如今输入的魔井,要找出使之“开启”的最少的移动步骤,程序须要输出中间八个格子的颜色,同时输出移动的步骤。bash
输入:markdown
魔井的每种颜色用数字来标识,1表明绿色,2表明红色、3表明蓝色、4表明黄色,输入为一行数字,数字从上到下,从左到右(如图中1-32的顺序)依次表明一个方块spa
下图可标识为:code
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 2orm
输出:队列
输出第一行为中间方格的颜色,第二行输出走过的步骤,以下:get
4it
DFio
思路:采用层序遍历(效率很低),从初始状态出发,分别能够向八个方向移动一步,而后再遍历这方格方向的下一步的移动,遍历时判断中间方格的颜色是否知足要求,知足了就中断遍历,输出结果。
代码用一个结构体来存储每一个树节点,有三个成员int型数组,用来存储32个方格的颜色,int level用来标识层序,char型数组用来存储通过的步骤。用一个队列来存储要遍历的节点,当遍历一个节点时,若是该节点不知足要求,就把它的子节点所有入列
代码:
#include <stdio.h> #include <queue> #include <memory> struct Node{ char color[33]; int level; char ans[100]; }; bool panduan(Node temp){ int a[8],i=0,j=0; a[0]=temp.color[10]; a[1]=temp.color[11]; a[2]=temp.color[12]; a[3]=temp.color[16]; a[4]=temp.color[17]; a[5]=temp.color[21]; a[6]=temp.color[22]; a[7]=temp.color[23]; for (i=0;i<8;i++) { for (j=i;j<8;j++) { if (a[i]!=a[j]) return false; } } return true; } void main(){ freopen("test.txt","r",stdin); freopen("out.txt","w",stdout); int i; Node first,temp,temp2; memset(&first,0,sizeof(first)); memset(&temp,0,sizeof(temp)); memset(&temp2,0,sizeof(temp2)); for (i=1;i<33;i++) { scanf("%d",&first.color[i]); getchar(); } first.level=0; std::queue<Node> q; if(panduan(first)){ temp2=first; } q.push(first); while (!q.empty()) { temp=q.front(); q.pop(); //A memcpy(&temp2,&temp,sizeof(temp)); temp2.color[1]=temp.color[3]; temp2.color[3]=temp.color[5]; temp2.color[5]=temp.color[10]; temp2.color[10]=temp.color[16]; temp2.color[16]=temp.color[21]; temp2.color[21]=temp.color[27]; temp2.color[27]=temp.color[29]; temp2.color[29]=temp.color[31]; temp2.color[31]=temp.color[1]; temp2.ans[temp2.level]='A'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //B memcpy(&temp2,&temp,sizeof(temp)); temp2.color[2]=temp.color[4]; temp2.color[4]=temp.color[6]; temp2.color[6]=temp.color[12]; temp2.color[12]=temp.color[17]; temp2.color[17]=temp.color[23]; temp2.color[23]=temp.color[28]; temp2.color[28]=temp.color[30]; temp2.color[30]=temp.color[32]; temp2.color[32]=temp.color[2]; temp2.ans[temp2.level]='B'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //C memcpy(&temp2,&temp,sizeof(temp)); temp2.color[7]=temp.color[15]; temp2.color[8]=temp.color[7]; temp2.color[9]=temp.color[8]; temp2.color[10]=temp.color[9]; temp2.color[11]=temp.color[10]; temp2.color[12]=temp.color[11]; temp2.color[13]=temp.color[12]; temp2.color[14]=temp.color[13]; temp2.color[15]=temp.color[14]; temp2.ans[temp2.level]='C'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //D memcpy(&temp2,&temp,sizeof(temp)); temp2.color[18]=temp.color[26]; temp2.color[19]=temp.color[18]; temp2.color[20]=temp.color[19]; temp2.color[21]=temp.color[20]; temp2.color[22]=temp.color[21]; temp2.color[23]=temp.color[22]; temp2.color[24]=temp.color[23]; temp2.color[25]=temp.color[24]; temp2.color[26]=temp.color[25]; temp2.ans[temp2.level]='D'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //E memcpy(&temp2,&temp,sizeof(temp)); temp2.color[2]=temp.color[32]; temp2.color[4]=temp.color[2]; temp2.color[6]=temp.color[4]; temp2.color[12]=temp.color[6]; temp2.color[17]=temp.color[12]; temp2.color[23]=temp.color[17]; temp2.color[28]=temp.color[23]; temp2.color[30]=temp.color[28]; temp2.color[32]=temp.color[30]; temp2.ans[temp2.level]='E'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //F memcpy(&temp2,&temp,sizeof(temp)); temp2.color[1]=temp.color[31]; temp2.color[3]=temp.color[1]; temp2.color[5]=temp.color[3]; temp2.color[10]=temp.color[5]; temp2.color[16]=temp.color[10]; temp2.color[21]=temp.color[16]; temp2.color[27]=temp.color[21]; temp2.color[29]=temp.color[27]; temp2.color[31]=temp.color[29]; temp2.ans[temp2.level]='F'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //G memcpy(&temp2,&temp,sizeof(temp)); temp2.color[18]=temp.color[19]; temp2.color[19]=temp.color[20]; temp2.color[20]=temp.color[21]; temp2.color[21]=temp.color[22]; temp2.color[22]=temp.color[23]; temp2.color[23]=temp.color[24]; temp2.color[24]=temp.color[25]; temp2.color[25]=temp.color[26]; temp2.color[26]=temp.color[18]; temp2.ans[temp2.level]='G'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); //H memcpy(&temp2,&temp,sizeof(temp)); temp2.color[7]=temp.color[8]; temp2.color[8]=temp.color[9]; temp2.color[9]=temp.color[10]; temp2.color[10]=temp.color[11]; temp2.color[11]=temp.color[12]; temp2.color[12]=temp.color[13]; temp2.color[13]=temp.color[14]; temp2.color[14]=temp.color[15]; temp2.color[15]=temp.color[7]; temp2.ans[temp2.level]='H'; temp2.level+=1; if(panduan(temp2)){ break; } else q.push(temp2); } printf("%d\n",temp2.color[10]); for (i=0;i<temp2.level;i++) { printf("%c",temp2.ans[i]); } }复制代码