NC214515. 井字棋
描述
输入描述
每组测试数据由三行组成,每行由一个长度为 3 的字符串组成,描述一个棋盘的情况。"X"代表黑棋,"."代表此位置没有棋。保证字符串仅包含以上两种字符。
输出描述
假设概率化为最简分式为 a/b,输出一行由空格隔开的两个整数 a b 代表答案。特别地,如果概率为 0,只输出一行一个整数 0 即可。
示例1
输入:
XXX XXX ...
输出:
1 1
C++(clang++11) 解法, 执行用时: 4ms, 内存消耗: 384K, 提交时间: 2020-12-05 12:25:43
#include<bits/stdc++.h> using namespace std; char g[4][4]; int num,f1,f2,sum; int h[4],z[4],a,b; int main() { for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { scanf("%c",&g[i][j]); if(g[i][j]=='X') { num++; h[i]++; z[j]++; if(i==j)f1++; if(i==4-j)f2++; } } getchar(); } for(int i=1;i<=3;i++) { if(h[i]==0)sum++; if(z[i]==0)sum++; } if(f1==0)sum++; if(f2==0)sum++; int k=9-num; a=sum*6; b=k*(k-1)*(k-2); if(b==0||a==0) { printf("0\n");return 0; } k=__gcd(a,b); printf("%d %d\n",a/k,b/k); }
Python3(3.9) 解法, 执行用时: 21ms, 内存消耗: 2904K, 提交时间: 2020-12-05 14:11:07
import math L=[] for i in range(3): s=input() L.append(s) ans=0 ans1=0 for i in range(3): if L[i][0]==L[i][1]==L[i][2]=='.': ans+=1 if L[0][i]==L[1][i]==L[2][i]=='.': ans+=1 for j in range(3): if L[i][j]=='.': ans1+=1 if L[0][0]==L[1][1]==L[2][2]=='.': ans+=1 if L[0][2]==L[1][1]==L[2][0]=='.': ans+=1 if ans==0: print(0) else: ans1 = ans1 * (ans1-1) *(ans1 - 2) //6 t = math.gcd(ans, ans1) print(ans//t,ans1//t)