列表

详情


NC214515. 井字棋

描述

现在有一个 3*3 的棋盘,上面只有一些黑棋(至多有六个黑棋)。 等概率随机地往棋盘中放入三个白棋,求这三个白棋刚好属于同一行或同一列或同一对角线的概率。

输入描述

每组测试数据由三行组成,每行由一个长度为 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)

上一题