(DFS)codevs1004 四子連棋

2022-08-14 08:12:15 字數 1038 閱讀 2521

題目位址

方法是建立dfs,並在其中加入pre變數,記錄之前移動的是w還是b。外面套for迴圈,從1步開始逐次遞增,直到在i步時可以走完(dfs返回1),break退出迴圈,即為最短步。

本題的關鍵主要是可能有走過來又走回去的無用情況。對於這道題,即使在最壞的情況,也基本上可以保證在15步以內(並未證明)達到目標狀態,所以可以在dfs中加入step進行限制,step等於外面for迴圈中的迴圈變數時就結束。這樣就有效避免了死迴圈的出現,對於處理這道題的情況比較方便。

注:以下**未考慮起始時就滿足條件的情況。

1 #include 2 #include 3 #include 4

using

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顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線 包括斜線 這樣的狀態為...