問題描述
"在五子棋的對弈中,友誼的小船說翻就翻?" 不!對小藍和小橋來說,五子棋不僅是棋盤上的較量,更是心與心之間的溝通。這兩位摯友秉承著"友誼第一,比賽第二"的宗旨,決定在一塊?5×55×5?的棋盤上,用黑白兩色的棋子來決出勝負。但他們又都不忍心讓對方失落,于是決定用一場和棋(平局)作為彼此友誼的見證。
比賽遵循以下規則:
- 棋盤規模:比賽在一個?5×55×5?的方格棋盤上進行,共有?2525?個格子供下棋使用。
- 棋子類型:兩種棋子,黑棋與白棋,代表雙方。小藍持白棋,小橋持黑棋。
- 先手規則:白棋(小藍)具有先手優勢,即在棋盤空白時率先落子(下棋)。
- 輪流落子:玩家們交替在棋盤上放置各自的棋子,每次僅放置一枚。
- 勝利條件:率先在橫線、豎線或斜線上形成連續的五個同色棋子的一方獲勝。
- 平局條件:當所有?2525?個棋盤格都被下滿棋子,而未決出勝負時,游戲以平局告終。
在這一設定下,小藍和小橋想知道,有多少種不同的棋局情況,既確保棋盤下滿又保證比賽結果為平局。
答案提交
這是一道結果填空題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
運行限制
語言 | 最大運行時間 | 最大運行內存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 3s | 512M |
Python3 | 10s | 512M |
PyPy3 | 3s | 512M |
Go | 5s | 512M |
JavaScript | 5s | 512M |
總通過次數: 721 |總提交次數: 1521 |通過率: 47.4%c茶
超時代碼
#include <bits/stdc++.h>
using namespace std;
int mp[6][6];
int cnt;
bool check()
{int cnt1 = 0, cnt2 = 0;for(int i = 1; i <= 5; i++){for(int j = 1; j <= 5; j++){if(mp[i][j] == 1)cnt1++;if(mp[i][j] == 2)cnt2++;}}if(cnt1 != 12 || cnt2 != 13) return false;for(int i = 1; i <= 5; i++){int flag = true;for(int j = 1; j <= 5; j++){if(mp[i][j] != mp[i][1]){flag = false;break;}}if(flag) return false;}for(int i = 1; i <= 5; i++){int flag = true;for(int j = 1; j <= 5; j++){if(mp[j][i] != mp[1][i]){flag = false;break;} }if(flag) return false;}int flag = true;for(int i = 1; i <= 5; i++){int j = i;if(mp[i][j] != mp[1][1]){flag = false;break;}}if(flag) return false;flag = true;for(int i = 1; i <= 5; i++){int j = 6 - i;if(mp[i][j] != mp[5][1]){flag = false;break;}}if(flag) return false;return true;}
void dfs(int a, int b)
{if(b == 6){dfs(a + 1, 1); return;}if(a == 6){if(check())cnt++;return;}mp[a][b] = 1;dfs(a, b + 1);mp[a][b] = 0;mp[a][b] = 2;dfs(a, b + 1);mp[a][b] = 0;
}
int main()
{dfs(1, 1);cout << cnt << endl;
}
ac代碼
#include<iostream>
using namespace std;
int mp[5][5];
long long sum=0;
void check(){int a=0;for(int i=0;i<5;i++){for(int j=0;j<5;j++){if(mp[i][j]==1) a++;}}if(a!=13) return;//此時滿足13-12 int count=0;count+=mp[0][0]+mp[1][1]+mp[2][2]+mp[3][3]+mp[4][4];if(count%5==0) return; count=0;count+=mp[0][4]+mp[1][3]+mp[2][2]+mp[3][1]+mp[4][0];if(count%5==0) return; count=0;for(int i=0;i<5;i++){count+=mp[i][0]+mp[i][1]+mp[i][2]+mp[i][3]+mp[i][4];if(count%5==0) return; count=0;count+=mp[0][i]+mp[1][i]+mp[2][i]+mp[3][i]+mp[4][i];if(count%5==0) return; count=0;}//滿足平局 sum++;
}
void dfs(int num){//依次由從左往右,再到從上往下的順序遍歷if(num==25){//棋盤下滿 check();return;}int x=num/5,y=num%5;//換算成坐標mp[x][y]=0;dfs(num+1);mp[x][y]=1;dfs(num+1);
}
int main(){dfs(0);//從0開始,遍歷所有結果cout<<sum;//3126376return 0;
}
#include <bits/stdc++.h>
using namespace std;
int mp[5][5];
int u=0;
void dfs(int sum,int h,int b)
{//地圖滿了;判斷if(sum==25){if(h==13&&b==12){for(int i=0;i<5;i++){int s=mp[i][0]+mp[i][1]+mp[i][2]+mp[i][3]+mp[i][4];if(s==5||s==0) return;}for(int i=0;i<5;i++){int m=mp[0][i]+mp[1][i]+mp[2][i]+mp[3][i]+mp[4][i];if(m==5||m==0) return;}int p=mp[0][0]+mp[1][1]+mp[2][2]+mp[3][3]+mp[4][4];int l=mp[0][4]+mp[1][3]+mp[2][2]+mp[3][1]+mp[4][0];if(p==0||p==5||l==0||l==5) return;u++;}return;}int x=sum/5;int y=sum%5;//計算坐標mp[x][y]=1;//選擇白棋dfs(sum+1,h+1,b);mp[x][y]=0;選擇黑棋dfs(sum+1,h,b+1);
}
int main()
{dfs(0,0,0);cout<<u;return 0;
}
#include <bits/stdc++.h>
using namespace std;
int ans, upp = (1 << 5) - 1;
bitset<5>area[6];
bool check(int y)
{if (area[y].count() == 5 || area[y].count() == 0)return false;if (y == 5){int sum = 0;int _sum = 0;for (int i = 0; i < 5; i++){sum = 0;for (int j = 1; j <= 5; j++)sum += area[j][i], _sum += area[j][i];if (sum == 0 || sum == 5)return false;}if (_sum != 13)return false;int suml = 0, sumr = 0;for (int i = 1; i <= 5; i++){suml += area[i][i-1];sumr += area[i][5-i];}if (suml == 5 || suml == 0 || sumr == 5 || sumr == 0)return false;}return true;
}
void dfs(int y)
{if (y == 6){ans++;return;}for (int i = 1; i <= upp; i++){bitset<5>temp(i);area[y] = temp;if (check(y))dfs(y + 1);}
}
int main()
{dfs(1);cout << ans;return 0;
}