[sicily online]1150. 簡單魔板

來源:互聯網
上載者:User
/*這個題要想清楚是用dfs還是bfs,dfs可能會得出不正確結果,例如AAAB所以用隊列實現bfsConstraintsTime Limit: 1 secs, Memory Limit: 32 MB , Special JudgeDescription魔板由8個大小相同方塊組成,分別用塗上不同顏色,用1到8的數字表示。其初始狀態是1 2 3 48 7 6 5對魔板可進行三種基本操作:A操作(上下行互換):8 7 6 51 2 3 4B操作(每次以行迴圈右移一個):4 1 2 35 8 7 6C操作(中間四小塊順時針轉一格):1 7 2 48 6 3 5用上述三種基本操作,可將任一種狀態裝換成另一種狀態。Input輸入包括多個要求解的魔板,每個魔板用三行描述。第一行步數N(不超過10的整數),表示最多容許的步數。第二、第三行表示目標狀態,按照魔板的形狀,顏色用1到8的表示。當N等於-1的時候,表示輸入結束。Output對於每一個要求解的魔板,輸出一行。首先是一個整數M,表示你找到解答所需要的步數。接著若干個空格之後,從第一步開始按順序給出M步操作(每一步是A、B或C),相鄰兩個操作之間沒有任何空格。注意:如果不能達到,則M輸出-1即可。Sample Input45 8 7 64 1 2 338 7 6 51 2 3 4-1Sample Output2 AB1 A*/#include<iostream>#include <iomanip>#include<stdio.h>#include<cmath>#include<iomanip>#include<list>#include <map>#include <vector>#include <string>#include <algorithm>#include <sstream>#include <stack>#include<queue>#include<string.h>#include<set>using namespace std;int N;int initdata[2][4]={{1,2,3,4},{8,7,6,5}};int goal[2][4];bool equal(int data[][4]){for(int i=0;i<2;i++){for(int j=0;j<4;j++){if(data[i][j]!=goal[i][j])return false;}}return true;}typedef struct STATUS{vector<char> oper;int deep;int data[2][4];}Status;int main(){while(cin>>N&&N!=-1){for(int i=0;i<8;i++)cin>>goal[i/4][i%4];queue<Status> qu;//表示深度Status st;st.deep=N;memcpy(st.data,initdata,sizeof(initdata));qu.push(st);bool flag=false;while(!qu.empty()){Status to=qu.front();qu.pop();if(equal(to.data)){cout<<to.oper.size()<<" ";for(int i=0;i<to.oper.size();i++)cout<<to.oper[i];cout<<endl;flag=true;break;}if(to.deep==0)continue;Status op;op.deep=to.deep-1;memcpy(op.data,to.data,sizeof(initdata));for(int i=0;i<4;i++)//A操作swap(op.data[0][i],op.data[1][i]);op.oper=to.oper;op.oper.push_back('A');qu.push(op);memcpy(op.data,to.data,sizeof(initdata));for(int i=0;i<2;i++)//B操作{int tmp=op.data[i][3];for(int j=3;j>0;j--){op.data[i][j]=op.data[i][j-1];}op.data[i][0]=tmp;}op.oper=to.oper;op.oper.push_back('B');qu.push(op);memcpy(op.data,to.data,sizeof(initdata));int tmp=op.data[0][1];op.data[0][1]=op.data[1][1];op.data[1][1]=op.data[1][2];op.data[1][2]=op.data[0][2];op.data[0][2]=tmp;op.oper=to.oper;op.oper.push_back('C');qu.push(op);}if(flag==false) cout<<-1<<endl;}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.