題目描述
在乙個4*4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始棋盤和乙個最終棋盤,要求你找出乙個最短的移動串行使初始棋盤變為最終棋盤。
klux說:「這麼簡單的題目,我都會做!」
輸入格式:
第1到4行每行四個數字(1或者0),描述了初始棋盤
接著是乙個空行
第6到9行每行四個數字,描述了最終棋盤
輸出格式:
輸出只有一行是乙個整數n,表示最少的移動步數。
輸入樣例#1:
1111
0000
1110
0010
1010
0101
1010
0101
輸出樣例#1:
4判斷一種狀態到另一種狀態
一種是深搜,直接將初始狀態和末狀態記錄下來,爆搜每個點的目的地,每一次搜尋的代價為,abs(橫座標差值)+abs(縱座標差值)
廣搜就是模擬每一次到達的狀態,因為有216種,所以需要用2進製模擬格仔的交換過程,分成分成向下和向左
不過我還是不太懂,為什麼tmp^^wz
能代表下乙個狀態,有大佬看見希望能告訴我一下
#include
#include
#include
#include
#include
using namespace std;
#define sum 15
#define n 4
#define line 3;
int ans,n,st,ed;
struct node
;int vis[100000]
;queueq;
void bfs())
; while(
!q.empty(
))
for(int i=15;i>=0;i--));}}
if(x<3&&
(tmp&w)
!=(tmp&dz))
);}}}}
}int main(
) for(int i=15;i>=0;i--)
if(st==ed) printf(
"0\n");
else bfs();
return 0;
}
//#include
#include
#include
#include
using namespace std;
char a[20]
[20],b[50]
;int sx[10],sy[10],ex[10],ey[10]
;int m,n,ans=0x3f3f3f,vis[10]
;void dfs(int k,int sum)
for(int i=1;i<=n;i++)}}
int main(
) if(b[j]
>a[i]
[j])}}
dfs(1,0)
; printf(
"%d\n",ans)
;return 0;
}
BFS 資訊學一本通(1451 棋盤遊戲)
在乙個4 4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始棋盤和乙個最終棋盤,要求你找出乙個最短的移動串行使初始棋盤變為最終棋盤。klux說 這麼簡單的題目,我都會做!第1到4行每行四個數字 1或者0 描述了初始棋...
資訊學奧賽一本通 1218 取石子遊戲
時間限制 1000 ms 記憶體限制 65536 kb 提交數 2463 通過數 1138 有兩堆石子,兩個人輪流去取。每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍,最後誰能夠把一堆石子取空誰就算贏。比如初始的時候兩堆石子的數目是25和7。25 7 11 7 ...
資訊學奧賽一本通 小球(drop)
許多的小球乙個乙個的從一棵滿二叉樹上掉下來組成fbt full binary tree,滿二叉樹 每一時間,乙個正在下降的球第乙個訪問的是非葉子節點。然後繼續下降時,或者走右子樹,或者走左子樹,直到訪問到葉子節點。決定球運動方向的是每個節點的布林值。最初,所有的節點都是false,當訪問到乙個節點時...