ZTE-中興捧月-北京線下測試賽--A題

魔井數組

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

}複製代碼
相關文章
相關標籤/搜索