codevs 1004 四子連棋

2021-08-03 14:26:13 字數 1324 閱讀 4360

題目描述 description

在乙個4*4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形成四個一線(包括斜線),這樣的狀態為目標棋局。●○

●○●○

●●○●

○○●○

輸入描述 input description

從檔案中讀入乙個4*4的初始棋局,黑棋子用b表示,白棋子用w表示,空格地帶用o表示。

輸出描述 output description

用最少的步數移動到目標棋局的步數。

這道題應該是用bfs來求解答案,不過使用ida也一樣可以很快的求出答案。

由於黑白雙方任意一方可以先走,所以需要記住要進行兩次搜尋,分別是兩方先開始的情況,還有要記住要多存乙個陣列,因為上一層用完的陣列,和開始的不一樣了。

搜尋的狀態很簡單,直接進行暴搜,由於限制了深度而且題目數值很小,所以基本不需要排重,就可以搜尋出答案,複雜度最高為2的16次方,所以限制深度為16以內就好了。

#include#include#define maxn 10

using namespace std;

char s[maxn][maxn];

char s2[maxn][maxn];

int n=4;

int ans=98765432;

int x1,x2,y1,y2;

int fx[maxn]=;

int fy[maxn]=;

bool check(char now[maxn])

bool flag=true;

void ida(char now[maxn],int o1x,int o1y,int o2x,int o2y,int dep,int cnt,int te)

for(int i=1;i<=n;i++)

if(te==2 && now[o1x+fx[i]][o1y+fy[i]]=='w')

}} if(flag==false)

return;

for(int i=1;i<=n;i++)

if(te==2 && now[o2x+fx[i]][o2y+fy[i]]=='w')

} }}

int main()

if(s[i][j]=='o' && flag==true)

}flag=true;

for(int i=2;i<=n*n;i++)

flag=true;

for(int i=2;i<=n*n;i++)

cout<

codevs 1004 四子連棋

1004 四子連棋 時間限制 1 s 空間限制 128000 kb 題目等級 gold題解 題目描述description 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋...

Codevs 1004 四子連棋

時間限制 1 s 空間限制 128000 kb 題目等級 gold 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形...

codevs 1004 四子連棋

1004 四子連棋 時間限制 1 s 空間限制 128000 kb 題目等級 gold 在乙個4 4的棋盤上擺放了14顆棋子,其中有7顆白色棋子,7顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得...