codevs 1004 四子連棋解題報告

2021-08-15 15:00:09 字數 2586 閱讀 9091

這道題,由於是求最小的深度,所以首先排除dfs(除非你有判重剪枝設定深度上限的小技巧,不然不建議使用dfs)。bfs可以很快得到思路,但是**實現卻十分繁瑣。

首先要考慮如何將圖加入佇列。有乙個很簡單的方法就是二進位制,一共有16個點,每個點只有0或1兩種情況(感謝claris大佬的指導),而int的上限為2^32,恰好可以儲存所有的點,於是就可以得到將圖轉化為數字的函式。

int cta(char b[5][5])

if(k=='w')

}} return a;

}

但是這樣做還不夠,還需要另外乙個佇列用於存放當前位置兩個空位的位置,深度,以及輪到哪一方下棋。

然後考慮如何判斷是否滿足四子連棋,這個很容易實現,這裡就不做過多分析。

bool check()

m%4?(c[m/4+1][m%4]='o'):(c[m/4][4]='o');

n%4?(c[n/4+1][n%4]='o'):(c[n/4][4]='o');

//恢復圖

/*for(int i=1;i<=4;i++)

if(!f&&c[y1+1][x1]=='w'&&y1+1<=4)

if(!f&&c[y1][x1-1]=='w'&&x1-1>0)

if(!f&&c[y1][x1+1]=='w'&&x1+1<=4)

if(f&&c[y1-1][x1]=='b'&&y1-1>0)

if(f&&c[y1+1][x1]=='b'&&y1+1<=4)

if(f&&c[y1][x1-1]=='b'&&x1-1>0)

if(f&&c[y1][x1+1]=='b'&&x1+1<=4)

}void pop()

m%4?(c[m/4+1][m%4]='o'):(c[m/4][4]='o');

n%4?(c[n/4+1][n%4]='o'):(c[n/4][4]='o');

int y1=m%4?m/4+1:m/4,x1=m%4?m%4:4,y2=n%4?n/4+1:n/4,x2=n%4?n%4:4;

p(x1,y1,(y2-1)*4+x2,q1[h][3],c);

p(x2,y2,(y1-1)*4+x1,q1[h][3],c);

h++;

}

以上函式包含了佇列所有的操作,補充乙個主函式程式就算完成了。

#include #include #include using namespace std;

int q[100009],q1[100009][4];

int h=1,t=0;

int cta(char b[5][5])

if(k=='w')

}} return a;

}void push(int a,int x,int y,int d,int f)

bool check()

m%4?(c[m/4+1][m%4]='o'):(c[m/4][4]='o');

n%4?(c[n/4+1][n%4]='o'):(c[n/4][4]='o');

//恢復圖

/*for(int i=1;i<=4;i++)

if(!f&&c[y1+1][x1]=='w'&&y1+1<=4)

if(!f&&c[y1][x1-1]=='w'&&x1-1>0)

if(!f&&c[y1][x1+1]=='w'&&x1+1<=4)

if(f&&c[y1-1][x1]=='b'&&y1-1>0)

if(f&&c[y1+1][x1]=='b'&&y1+1<=4)

if(f&&c[y1][x1-1]=='b'&&x1-1>0)

if(f&&c[y1][x1+1]=='b'&&x1+1<=4)

}void pop()

m%4?(c[m/4+1][m%4]='o'):(c[m/4][4]='o');

n%4?(c[n/4+1][n%4]='o'):(c[n/4][4]='o');

int y1=m%4?m/4+1:m/4,x1=m%4?m%4:4,y2=n%4?n/4+1:n/4,x2=n%4?n%4:4;

p(x1,y1,(y2-1)*4+x2,q1[h][3],c);

p(x2,y2,(y1-1)*4+x1,q1[h][3],c);

h++;

}int main()

}a=cta(c);

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

if(c[i][j]=='o'&&f)}}

qwq:

q[1]=a;q1[1][2]=0;q1[1][3]=0;

t++;

q[2]=q[1];q1[2][0]=q1[1][0];q1[2][1]=q1[1][1];q1[2][3]=1;

t++;

//q1[i][0,1]表示空格位置,q1[i][2]表示深度,q1[i][3]表示目前哪方下棋。

while(!check())

printf("%d",q1[h][2]);

return 0;

}

codevs 1004 四子連棋

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

codevs 1004 四子連棋

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

Codevs 1004 四子連棋

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