這道題,由於是求最小的深度,所以首先排除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顆黑色棋子,有兩個空白地帶,任何一顆黑白棋子都可以向上下左右四個方向移動到相鄰的空格,這叫行棋一步,黑白雙方交替走棋,任意一方可以先走,如果某個時刻使得任意一種顏色的棋子形...