2024蓝桥A组B题

问题描述

“在五子棋的对弈中,友谊的小船说翻就翻?”
不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。
这两位挚友秉承着“友谊第一,比赛第二” 的宗旨,决定在一块5 × 5 的棋盘上,用黑白两色的棋子来决出胜负。
但他们又都不忍心让对方失落,于是决定用一场和棋(平局)作为彼此友谊的见证。
比赛遵循以下规则:

  1. 棋盘规模:比赛在一个5 × 5 的方格棋盘上进行,共有25 个格子供下棋使用。
  2. 棋子类型:两种棋子,黑棋与白棋,代表双方。小蓝持白棋,小桥持黑棋。
  3. 先手规则:白棋(小蓝)具有先手优势,即在棋盘空白时率先落子(下棋)。
  4. 轮流落子:玩家们交替在棋盘上放置各自的棋子,每次仅放置一枚。
  5. 胜利条件:率先在横线、竖线或斜线上形成连续的五个同色棋子的一方获胜。
  6. 平局条件:当所有25 个棋盘格都被下满棋子,而未决出胜负时,游戏以平局告终。
    在这一设定下,小蓝和小桥想知道,有多少种不同的棋局情况,既确保棋盘下满又保证比赛结果为平局。
    终局不同看成不同情况,终局相同而落子顺序不同看成同一种情况。
    本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

格式输入


格式输出

一个整数


评测用例规模与约定


解析

dfs爆搜,所有情况搜出来进行判断是不是平局,同时注意判断条件。主要是check和dfs这逻辑写好就能做出来。有大佬用状压dp做。。。


参考程序

#include<bits/stdc++.h>
using namespace std;
const int N=5;
int dp[N][N];//存储棋盘状态1白2黑
int ans;//计方案数
bool check()//检查是否为平局
{
    for(int i=0;i<N;i++)//检查行
    {
        if(dp[i][0]==-1)continue;
        bool ok=true;
        for(int j=1;j<N;j++)
            if(dp[i][j]!=dp[i][0])
            {
                ok=false;
                break;
            }
        if(ok)return true;
    }
    for(int j=0;j<N;j++)//检查列
    {
        if(dp[0][j]==-1)continue;
        bool ok=true;
        for(int i=1;i<N;i++)
            if(dp[i][j]!=dp[0][j])
            {
                ok=false;
                break;
            }
        if(ok)return true;
    }
    if(dp[0][0]!=-1)//检查主对角线
    {
        bool ok=true;
        for(int i=1;i<N;i++)
            if(dp[i][i]!=dp[0][0])
            {
                ok=false;
                break;
            }
        if(ok)return true;
    }
    if(dp[0][N-1]!=-1)//检查副对角线
    {
        bool ok=true;
        for(int i=1;i<N;i++)
            if(dp[i][N-1-i]!=dp[0][N-1])
            {
                ok=false;
                break;
            }
        if(ok)return true;
    }
    return false;
}
void dfs(int x,int y)//dfs
{
    if(check())return;//检查成功是平局return
    if(x==N)
    {
        int sum=0;
        for(int i=0;i<N;i++)
            for(int j=0;j<N;j++)
                if(dp[i][j]==1)sum+=dp[i][j];
        if(sum==13)ans++;//一共25个格子,白的13够了
        return;
    }
    int dx=x,dy=y;
    if(y+1<N)dy++;else dy=0,dx++;
    dp[x][y]=1;//放白棋
    dfs(dx,dy);
    dp[x][y]=2;//放黑棋
    dfs(dx,dy);
    dp[x][y]=-1;//回溯
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    memset(dp,-1,sizeof(dp));//初始化设为-1;
    dfs(0,0);
    cout<<ans;
    return 0;
}

难度等级

⭐️⭐️⭐️再加半颗(1~10星)

以个人刷题整理为目的,如若侵权,请联系删除~

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
2023Python B组是一个Python编程竞赛组别,属于杯全国软件和信息技术专业人才大赛。杯是中国最有影响力的IT竞赛之一,旨在发现和培养软件和信息技术领域的优秀人才。2023年将举办杯竞赛中的Python B组,意味着这个组别将使用Python编程语言进行竞赛。 Python作为一种简单易学的编程语言,拥有较强的可读性和灵活性。它在数据分析、人工智能、Web开发等领域得到广泛应用。Python B组的参赛选手有机会展示自己在Python编程方面的技术实力和创造力。 对于2023Python B组的参赛选手来说,要想在竞赛中取得好成绩,首先需要扎实的Python编程基础。熟悉Python的基本语法、掌握常用的库和模块,是竞赛成功的基石。 其次,参赛选手还需要具备良好的逻辑思维和问解决能力。竞赛中可能遇到各种难,需要分析问、设计算法,并用Python代码实现解决方案。 此外,团队合作也是成功的关键。选手需要与队友密切合作,共同解决问、讨论和优化代码。团队的相互支持和协作能够提高整个团队的竞赛水平和效率。 总的来说,2023Python B组是一个为期一年的Python编程竞赛,提供了一个展示个人实力和创意的舞台。参赛选手需要具备扎实的编程基础、良好的逻辑思维和问解决能力,并与队友紧密合作,共同实现竞赛目标。参与这个竞赛可以提高个人的编程水平、锻炼团队合作能力,并有机会获得诸如荣誉证书、奖金等奖励。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值