題目位址
方法是建立dfs,並在其中加入pre變數,記錄之前移動的是w還是b。外面套for迴圈,從1步開始逐次遞增,直到在i步時可以走完(dfs返回1),break退出迴圈,即為最短步。
本題的關鍵主要是可能有走過來又走回去的無用情況。對於這道題,即使在最壞的情況,也基本上可以保證在15步以內(並未證明)達到目標狀態,所以可以在dfs中加入step進行限制,step等於外面for迴圈中的迴圈變數時就結束。這樣就有效避免了死迴圈的出現,對於處理這道題的情況比較方便。
注:以下**未考慮起始時就滿足條件的情況。
1 #include 2 #include 3 #include 4using
namespace
std;
5char a[10][10];6
int dir[4][2]=,,,},ans,ox1=-1,ox2,oy1,oy2;//
dir陣列儲存方向,ox\oy記錄兩個空位
7bool check()//
檢驗此時棋盤是否滿足條件820
return0;
21}22bool val(int x,int y,char p)//
檢驗位置是否合法
2326
bool dfs(int x1,int y1,int x2,int y2,char pre,int
step)
2733
for(int i=0;i<4;i++)
3446
if(val(xm,ym,pre))
4752}53
return0;
54}55int
main()
5670
else
71 72}
73}74}
75for(ans=1;ans<100000;ans++)//
從第一步開始逐次進行
7682 printf("
%d\n
",ans);
83return0;
84 }
wikioi1004 四子連棋
題目描述 description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線 包括斜線 這樣的狀態為...
codevs 1004 四子連棋
1004 四子連棋 時間限制 1 s 空間限制 128000 kb 題目等級 gold題解 題目描述description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋...
codevs 1004 四子連棋
題目描述 description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線 包括斜線 這樣的狀態為...