description
魔板由8個大小相同方塊組成,分別用塗上不同顏色,用1到8的數字表示。
其初始狀態是
1 2 3 4
8 7 6 5
對魔板可進行三種基本操作:
a操作(上下行互換):
8 7 6 5
1 2 3 4
b操作(每次以行迴圈右移乙個):
4 1 2 3
5 8 7 6
c操作(中間四小塊順時針轉一格):
1 7 2 4
8 6 3 5
用上述三種基本操作,可將任一種狀態裝換成另一種狀態。
input
輸入包括多個要求解的魔板,每個魔板用三行描述。
第一行步數n(不超過10的整數),表示最多容許的步數。 第
二、第三行表示目標狀態,按照魔板的形狀,顏色用1到8的表示。
當n等於-1的時候,表示輸入結束。
output
對於每乙個要求解的魔板,輸出一行。
首先是乙個整數m,表示你找到解答所需要的步數。接著若干個空格之後,從第一步開始按順序給出m步操作(每一步是a、b或c),相鄰兩個操作之間沒有任何空格。
注意:如果不能達到,則m輸出-1即可。
// problem#: 1150
// submission#: 3823447
// the source code is licensed under creative commons attribution-noncommercial-sharealike 3.0 unported license
// uri:
// easy_moban.cpp
#include "iostream"
#include "string.h"
using namespace std ;
class moban
moban (int x1 , int x2 , int x3 , int x4 , int y1 , int y2 , int y3 , int y4)
bool operator==(moban &m2)
}return true ;
}bool operator!=(moban &m2)
};moban stan_moban = moban( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ) ;
int stan_dep = 0 , flag = 0 ;
void dfs(moban m , int dep , string now )
else if ( (dep == stan_dep) && (m != stan_moban) )
if( m == stan_moban )
if(flag == 0)
if(flag == 0 )
if(flag == 0 )
if(flag == 0 && dep == 0 )
return ;
}int main ()
return 0 ;
}
sicily 簡單魔板2
sicily上面的三道 簡單魔板 的變形,開始以為資料變大了第一道題的解法行不通了,其實不然。網上看到用康托展開來進行儲存狀態的,發現其實對於這道題沒能發揮康托展開的強大威力。下面是找到別人的 自己加了一些注釋 嗚嗚,我不想剽竊的。只是 不了。原文出處 其實這道題沒必要使用康托編碼,這裡沒發揮它的強...
Sicily 1150 簡單魔板(BFS)
此題可以使用bfs進行解答,使用8位的十進位制數來儲存魔板的狀態,用bfs進行搜尋即可 1 include 2 using namespace std 34 int op a int n 910 int op b int n 1920 int op c int n 26int ans a 0 100...
字尾陣列 魔板
為什麼一開始要再字串末尾多算個0呢 因為當開始分關鍵字比較的時候 最後要組成兩個 字元所以要多個0 什麼你有問我為什麼填0 因為0小啊 先處理唄 雖然 sa是根據每個字元確定的大小 也就是排布的每個字元的排名 但是在初次求第二關鍵字排序的時候 可以使用sa的結論 首先吧sa後面的0排到最前面 那麼0...