能够符合题目要求的只有三行三列两对角线。
首先需要统计符合条件的摆放数和总空出来的棋子数。
总的摆放可能性为 ,最后同除以最大公约数化成最简分式即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e8;
ll supergcd(ll a, ll b) {
if (!a) return b;
if (!b) return a;
if (!(a&1)&&!(b&1)) return supergcd(a>>1, b>>1)<<1;
else if (!(b&1)) return supergcd(a, b>>1);
else if (!(a&1)) return supergcd(a>>1, b);
else return supergcd(abs(a-b), min(a, b));
}
ll com(ll n, ll r) {
if (n-r > r) r = n-r;
ll s = 1;
for(ll i = 0, j = 1; i < r; ++i) {
s = s * (n-i);
for(; j <= r && s % j == 0; ++j) {
s /= j;
}
}
return s;
}
int main() {
char chs[3][3];
while (scanf("%s%s%s", chs[0], chs[1], chs[2]) != EOF) {
int ans1 = 0, ans2 = 0;
// 统计一共空出来的棋子个数
for(int i = 0; i < 3; ++i) {
for(int j = 0; j < 3; ++j) {
if (chs[i][j] == '.') {
ans2++;
}
}
}
// 用组合数找出总情况个数
ans2 = com(ans2, 3);
// 漫长的统计过程
if (chs[0][0] == '.' && chs[0][1] == '.' && chs[0][2] == '.') {
ans1++;
}
if (chs[1][0] == '.' && chs[1][1] == '.' && chs[1][2] == '.') {
ans1++;
}
if (chs[2][0] == '.' && chs[2][1] == '.' && chs[2][2] == '.') {
ans1++;
}
if (chs[0][0] == '.' && chs[1][0] == '.' && chs[2][0] == '.') {
ans1++;
}
if (chs[0][1] == '.' && chs[1][1] == '.' && chs[2][1] == '.') {
ans1++;
}
if (chs[0][2] == '.' && chs[1][2] == '.' && chs[2][2] == '.') {
ans1++;
}
if (chs[0][0] == '.' && chs[1][1] == '.' && chs[2][2] == '.') {
ans1++;
}
if (chs[0][2] == '.' && chs[1][1] == '.' && chs[2][0] == '.') {
ans1++;
}
if (ans1) {
int gcd = supergcd(ans1, ans2);
printf("%d %d\n", ans1/gcd, ans2/gcd);
}
else {
printf("0\n");
}
}
}

京公网安备 11010502036488号