魔井數組
題目:以下圖所示一個魔井,魔井由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]); } }複製代碼