題目描述 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顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得...