当前位置: 首页 > news >正文

弹珠游戏【牛客tracker 每日一题】

弹珠游戏

时间限制:1秒 空间限制:256M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述

A l i c e AliceAlice对弹珠游戏已经有些厌烦了,她经常在电脑上玩这个游戏。她之所以感到厌烦是因为在这个游戏上她已经是专家级别,她总是能够和电脑打成平手。⁡ B o b ⁡BobBob⁡ A l i c e ⁡AliceAlice创造了一款新的电脑游戏。以下是这款两人电脑游戏的规则:

1.游戏在如下图所示的菱形棋盘上进行;

2. 两名玩家轮流放置弹珠,可以在横向、纵向、45 4545度斜线、135 135135度斜线方向未放置弹珠的位置连续放置1 113 33颗弹珠,玩家在可以放置弹珠的情况下,必须至少放置1 11颗弹珠。以下是合法的单次放置操作的示例(黑色圆点表示放置了弹珠,白色圆点表示未放置弹珠,进行该次操作前棋盘为空):

以下是非法的单次放置操作的示例(黑色圆点表示放置了弹珠,白色圆点表示未放置弹珠,进行该次操作前棋盘为空):

非法原因的解释:(a aa)三颗弹珠不在同一条斜线(或者垂直线)上;(b bb)两颗弹珠之间相隔一个空位;(c cc)三颗弹珠不在同一条斜线上;(d dd)三颗弹珠不在同一条斜线(或者垂直线)上;(e ee)一次性放置了4 44颗弹珠;(f ff)三颗弹珠不在同一条水平线(或者垂直线、或者斜线)上。

3. 如果某位玩家无法再继续放置弹珠,则该名玩家输掉游戏,另外一名玩家获胜。

⁡ A l i c e ⁡AliceAlice总是第一个进行游戏,而且经常是和⁡ B o b ⁡BobBob玩这个游戏,B o b BobBob在进行若干游戏操作后可能会离开,将游戏交由电脑代理,电脑总是按照最优策略放置弹珠。
给定B o b BobBob离开后的游戏状态,你的任务是确定A l i c e AliceAlice是否可能在对阵电脑时获得胜利。

输入描述:

每个测试文件均包含多组测试数据。第一行输入一个整数T ( 1 ≦ T ≦ 200 ) T(1≦T≦200)T(1T200)代表数据组数,每组测试数据描述如下:

一共七行,每行输入一个字符串,表示B o b BobBob离开后的游戏状态。字符串的长度依次为1 , 2 , 3 , 4 , 3 , 2 , 1 1,2,3,4,3,2,11,2,3,4,3,2,1,且仅由‘ ∗ ’ ‘*’‘ . ’ ‘.’‘.’构成。‘ ∗ ’ ‘*’表示该位置已经放置了弹珠,‘ . ’ ‘.’‘.’表示该位置未放置弹珠。

除此之外,每组测试文件间使用一个空行间隔。

输出描述:

对于每组测试数据,如果A l i c e AliceAlice能够获胜,输出A l i c e AliceAlice,否则输出⁡ B o b ⁡BobBob

示例1

输入:

6 * * * * * * * * * * . * * . * . * * * * * * . . . * * * * * * * * * * * * . * * * * * * . * * * * * * . . * * * * * * * * * * * . * * * * * * * * . * * * * * * . * . * * . * * * . * * * * * *

输出:

Alice Alice Alice Alice Bob Alice

说明:

第一组数据,⁡ A l i c e ⁡AliceAlice可以选择在棋盘左下角的斜线方向所剩下的3 33个空余位置一次性连续放置3 33颗弹珠,使得后续电脑无法再放置弹珠,因此A l i c e AliceAlice能够获胜。

第二组数据,A l i c e AliceAlice可以选择沿着第四行剩下的3 33个空余位置一次性连续放置3 33颗弹珠,使得后续电脑无法再放置弹珠,因此A l i c e AliceAlice能够获胜。

第三组数据,棋盘剩下倒数第二列两个连续的空余位置,⁡ A l i c e ⁡AliceAlice可以一次放置2 22颗弹珠,使得后续电脑无法放置弹珠,因此A l i c e AliceAlice会获胜。

第四组数据,类似于第二组测试数据,棋盘剩下第三行两个连续的空余位置,因此A l i c e AliceAlice会获胜。

第五组数据,棋盘只剩下两个不连续的空余位置,由于⁡ A l i c e ⁡AliceAlice一次只能选择一个空余位置放置1 11颗弹珠,因此不管A l i c e AliceAlice如何操作,电脑总能一次性将剩下的棋盘使用弹珠填满,使得A l i c e AliceAlice无法再继续放置弹珠,因此⁡ A l i c e ⁡AliceAlice会输掉比赛。

第六组数据,A l i c e AliceAlice可以选择在棋盘右上角斜线方向的中间两个空余位置放置2 22颗弹珠,使得棋盘状态转化为样例输入的第五组数据,因此A l i c e AliceAlice会赢得比赛。

解题思路

本题核心是博弈论+记忆化搜索,判定菱形棋盘上先手A l i c e AliceAlice是否必胜。将不规则菱形棋盘映射为4 × 4 4×44×4标准网格,简化坐标遍历。采用胜负态规则:无空位可放弹珠时当前玩家败;若存在任意合法操作(横/竖/45 ° 45°45°/135 ° 135°135°斜线连续放1 − 3 1-313颗弹珠)使对手进入败态,则当前态为胜态。使用哈希表记忆化存储棋盘状态,避免重复递归计算。遍历所有合法操作,递归判断后续状态,最终确定当前状态的胜负,输出对应结果。算法通过坐标映射与记忆化剪枝,高效处理多组测试数据,精准匹配游戏规则。

总结

核心逻辑:博弈论胜负态判定,先手存在必胜操作则A l i c e AliceAlice胜,否则B o b BobBob胜。
关键操作:菱形棋盘转4 × 4 4×44×4网格、枚举四方向连续1 − 3 1-313个合法放置、记忆化存储状态。
效率保障:记忆化搜索剪枝,避免重复计算,高效处理题目约束的测试数据规模。

代码内容

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll p=1e9+7;constll INF=1e18;constll M=1e6+10;map<vector<string>,ll>vsl;llfind(vector<string>s){if(vsl.count(s))returnvsl[s];ll ans=0;for(ll i=0;i<4;i++)for(ll j=0;j<4;j++){if(s[i][j]=='.')ans++;}if(ans==0){returnvsl[s]=-1;}for(ll i=0;i<4;i++){for(ll j=0;j<4;j++){if(s[i][j]=='.'){vector<string>vs=s;for(ll p=i;p<min(4ll,i+3);p++){if(vs[p][j]=='.'){vs[p][j]='*';if(find(vs)==-1){returnvsl[s]=1;}}elsebreak;}vs=s;for(ll p=j;p<min(j+3,4ll);p++){if(vs[i][p]=='.'){vs[i][p]='*';if(find(vs)==-1){returnvsl[s]=1;}}elsebreak;}vs=s;for(ll p=i,q=j;p<min(4ll,i+3)&&q<min(4ll,j+3);p++,q++){if(vs[p][q]=='.'){vs[p][q]='*';if(find(vs)==-1){returnvsl[s]=1;}}elsebreak;}vs=s;for(ll p=i,q=j;p<min(4ll,i+3)&&q>max(-1ll,j-3);p++,q--){if(vs[p][q]=='.'){vs[p][q]='*';if(find(vs)==-1){returnvsl[s]=1;}}elsebreak;}}}}returnvsl[s]=-1;}intmain(){ll t;cin>>t;vector<pll>vp={{0,0},{1,0},{0,1},{2,0},{1,1},{0,2},{3,0},{2,1},{1,2},{0,3},{3,1},{2,2},{1,3},{3,2},{2,3},{3,3}};while(t--){vector<string>s(4,"....");for(ll i=0;i<16;i++){ll x=vp[i].first;ll y=vp[i].second;charp;cin>>p;s[x][y]=p;}ll ans=find(s);if(ans==1)cout<<"Alice"<<endl;elsecout<<"Bob"<<endl;}return0;}
http://www.jsqmd.com/news/684833/

相关文章:

  • XIAO ePaper开发套件评测与低功耗应用实践
  • 送料机械手(总装图,部装图,5个零件图,设计说明书)
  • GraalVM Native Image内存暴涨?揭秘堆外内存失控的4类隐蔽根源及实时诊断SOP
  • 低成本IMU+编码器搞定室外建图:ROS2 Humble下robot_localization与Cartographer实战避坑
  • Transformer架构与延迟融合技术在机器人控制中的应用
  • AutoSubs完整指南:5分钟掌握AI自动字幕生成,视频制作效率提升300% [特殊字符]
  • 计算机毕业设计:Python股票数据可视化与LSTM股价预测系统 Flask框架 LSTM Keras 数据分析 可视化 深度学习 大数据 爬虫(建议收藏)✅
  • 增长破局:大厂小店都要抓好的三个核心-佛山鼎策创局破解增长咨询 
  • 让Windows任务栏消失的艺术:TranslucentTB如何重新定义桌面美学
  • GAN原理与实现:从基础概念到PyTorch实战
  • 手写简化版 Vue 3 虚拟 DOM:100 行代码搞懂 Diff 核心逻辑
  • Java8 为什么这里把key的hashcode取出来,然后把它右移16位,然后取异或?
  • 在Linux上畅享完整B站体验:哔哩哔哩Linux客户端深度指南
  • Docker集群调试秘钥泄露事件复盘(含cgroup v2内存泄漏、overlay2元数据损坏、runc版本兼容性陷阱)
  • nli-MiniLM2-L6-H768入门指南:理解entailment/contradiction/neutral三分类含义
  • 保姆级教程:手把手搭建你的第一个ARM AHB/APB小系统(附Verilog代码与仿真环境)
  • Java Map进阶指南:compute、computeIfAbsent、computeIfPresent、putIfAbsent、getOrDefault 核心方法实战辨析
  • 量子计算中的GRAMPUS脉冲调度与类型系统设计
  • P1183 多边形的面积【洛谷算法习题】
  • 软件测试工程师简历项目经验怎么写?1000套简历模板告诉你答案
  • 机器学习中三种均值方法的原理与应用场景
  • 如何免费延长JetBrains IDE试用期:IDE Eval Resetter完整使用教程
  • Docker医疗配置的“隐形雷区”:DICOM协议栈、HL7 v2.x时区处理与FHIR R4资源版本冲突(三甲信息科绝密排查手册)
  • SQL中窗口函数使用注意事项_避免潜在的数据陷阱
  • HarmonyOS6 ArkTS TextArea组件使用文档
  • 我开起来已经是一个全栈开发者
  • 别再手动建模了!3DMAX 2011+ 用户必看:这个螺母螺栓插件,5分钟搞定标准件
  • 超越Pandas:7种高效大数据处理技术对比
  • 基于vue的宏图企业档案资料管理系统[vue]-计算机毕业设计源码+LW文档
  • Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】