中国计量大学现代科技学院第四届“中竞杯”程序设计校赛(同步赛)- A题

井字棋

https://ac.nowcoder.com/acm/contest/9680/A

能够符合题目要求的只有三行三列两对角线。
首先需要统计符合条件的摆放数和总空出来的棋子数。
总的摆放可能性为图片说明 ,最后同除以最大公约数化成最简分式即可。

#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");
        }
    }
}
全部评论

相关推荐

lingo12:1.最好加个业务项目,大部分面试官工作以后会更偏重业务 2.实习部分描述一般般,可能hr看到会觉得你产出不够不给你过简历 3.蓝桥杯这些大部分人都有的,不如不写,反而减分项。
点赞 评论 收藏
分享
02-02 20:25
门头沟学院 Java
数学转码崽:八股文也算是前人总结的精华,但是因为全是结果导向,你光背不去理解它背后的深层原理和这样做的原因,反而忽略了程序员最该重视的过程导向。推荐你不会的就去多问ai,比如我当时背的时候,concurrenthashmap底层原理常见八股网站都会讲,但是我不理解为什么它去用synchronize锁节点,为什么不用reentrantlock去锁节点。面试官问我你为什么觉得synchronize在这个场景下性能更好呢?虽然面试官可能也不确定清楚,但是你可以尝试给他解答,让他看见你的思考,这才是最重要的,毕竟你没实习,你的项目你也无法证明是你自己思考的产物,那就在别的地方体现你的能力
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务