棋盤遊戲(game)
源程式名 game.??? (pas,c,cpp)
可執行檔名 game.exe
輸入檔名 game.in
輸出檔名 game.out
時限 2s
在乙個4*4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始棋盤和乙個最終棋盤,要求你找出乙個最短的移動串行使初始棋盤變為最終棋盤。
klux說:「這麼簡單的題目,我都會做!」
輸入:
第1到4行每行四個數字(1或者0),描述了初始棋盤
接著是乙個空行
第6到9行每行四個數字,描述了最終棋盤
輸出:
輸出檔案的第一行是乙個整數n,表示最少的移動步數。
接下來n行每行4個數,r1,c1,r2,c2,表示移動的兩個棋子的座標(r1,c1),(r2,c2)(棋盤左上角的座標為(1,1),並且他右邊的格仔為(1,2))
如果有許多組解,你可以輸出任意一組。
樣例:
game.in:
1111
0000
1110
0010
1010
0101
1010
0101
game.out
41 2 2 2
1 4 2 4
3 2 4 2
4 3 4 4
說明:
翻譯自ceoi99-game,資料及解答由ceoi提供。
本題應該用雙向的廣度搜尋
#include
#include
using namespace std;
ifstream fin ("game.in");
ofstream fout ("game.out");
int i,j,k,s,e[10000][5],eb[10000][5],o,c1;
string a[10000],b[10000],q;
char c;
int compete1 (int i1)
int compete2 (int i1)
int check (int i1)
int check2 (int i1)
int print (int s1, int deep)
for (i=1;i<=4;i++)
e[1][1]=0;
i=1;
s=k=2;
while (a[i]!=b[i])
o=compete1 (s-1);
int k1=o;
if (o!=0)
print (s-1,0);
print2 (o);
exit (1);
}if (j<12&&a[i][j]!=a[i][j+4])
o=compete1 (s-1);
if (o!=0)
print (s-1,0);
print2 (o);
exit (1);
}if ((j+1)%4!=0&&b[i][j]!=b[i][j+1])
o=compete2 (k-1);
if (o!=0)
print (o,0);
print2 (k-1);
exit (1);
}if (j<12&&b[i][j]!=b[i][j+4])
o=compete2 (k-1);
if (o!=0)
print (o,0);
print2 (k-1);
exit (1);}}
i++;
}print (s-1,0);
return 0;
}
轉圈遊戲 解題報告
轉圈遊戲 noip2013提高組day1 time limit 1000ms memory limit 128000k description 問題描述 circle.cpp c pas n 個小夥伴 編號從 0 到 n 1 圍坐一圈玩遊戲。按照順時針方向給 n 個位置編號,從0 到 n 1。最初,...
數字遊戲 解題報告
題目鏈結 題目大意 有一圈整數 一共n個 按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。要求是使你所得的k最大或者最小。題目分析 1.首先對於環狀的題目首先想到的就是將環狀的轉化為線性的,這也將大大簡化我們解題的過程。我們可以將環從n和1中間斷開...
ZJOI2007 棋盤製作 解題報告
西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好...