蓝桥杯-火柴游戏

2018 csp认证 第四题 棋局评估(对抗搜索) 试题编号: 201803-4 试题名称: 棋局评估 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   Alice和Bob正在玩井字棋游戏。   井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格... 阅读详情
【编程题】(满分34分)

    这是一个纵横火柴棒游戏。如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒。其规则是:



    1. 不能放置在已经放置火柴棒的地方(即只能在空格中放置)。

    2. 火柴棒的方向只能是竖直或水平放置。

    3. 火柴棒不能与其它格子中的火柴“连通”。所谓连通是指两根火柴棒可以连成一条直线,且中间没有其它不同方向的火柴“阻拦”。

    例如:图[1.jpg]所示的局面下,可以在C2位置竖直放置(为了方便描述格子位置,图中左、下都添加了标记),但不能水平放置,因为会与A2连通。同样道理,B2,B3,D2此时两种方向都不可以放置。但如果C2竖直放置后,D2就可以水平放置了,因为不再会与A2连通(受到了C2的阻挡)。

    4. 游戏双方轮流放置火柴,不可以弃权,也不可以放多根。直到某一方无法继续放置,则该方为负(输的一方)。

    游戏开始时可能已经放置了多根火柴。

    你的任务是:编写程序,读入初始状态,计算出对自己最有利的放置方法并输出。

    如图[1.jpg]的局面表示为:

00-1
-000
0100

    即用“0”表示空闲位置,用“1”表示竖直放置,用“-”表示水平放置。

【输入、输出格式要求】
  
    用户先输入整数 n(n<100), 表示接下来将输入 n 种初始局面,每种局面占3行(多个局面间没有空白行)。

    程序则输出:每种初始局面情况下计算得出的最佳放置法(行号+列号+放置方式)。

    例如:用户输入:
2
0111
-000
-000
1111
----
0010

   则程序可以输出:
00-
211

   不难猜出,输出结果的含义为:
   
   对第一个局面,在第0行第0列水平放置
   
   对第二个局面,在第2行第1列垂直放置

   注意:
   
   行号、列号都是从0开始计数的。
       
   对每种局面可能有多个最佳放置方法(解不唯一),只输出一种即可。

   例如,对第一个局面,001 也是正解;最第二个局面,201也是正解。


分析:使用博弈思想+回溯法

java代码如下:

import java.util.Scanner;

//火柴游戏
public class MatchGame {
	public static void main(String[] args) {
		//map数组值对应意义:0表示留空,1表示垂直,-1表示水平
		Scanner scanner=new Scanner(System.in);
		for(int i=0;i<3&&scanner.hasNextLine();i++){
			String str=scanner.nextLine();
			char[] nums=str.toCharArray();
			for(int j=0;j<4;j++){
				if(nums[j]=='-'){
					map[i][j]=-1;
				}else if(nums[j]=='1'){
					map[i][j]=1;
				}
			}
		}	
		process();
	}
	public static void process(){
		for(int i=0;i<3;i++)
			for(int j=0;j<4;j++){
				if(map[i][j]==0){//如果位置为空位
					for(int t=0;t<2;t++){//可以放置水平和垂直两种火柴
						map[i][j]=types[t];
						if(isWin(i,j,types[t])){//判断是否必赢
							//如果必赢,则输出结果
							System.out.print(i+""+j);
							if(types[t]==1){
								System.out.println(1);
							}else{
								System.out.println("-");
							}
							return;
						}
						map[i][j]=0;
					}
				}
			}
		System.out.println("输定了");
	}
	static int[] types=new int[]{1,-1};
	static int[][] map=new int[3][4];
	
	//调用方在i,j位置填入type能否必赢
	public  static boolean isWin(int i,int j,int type){
		//验证是否合法
		if(!validate(i,j,type))return false;
		
		for(int a=0;a<3;a++){
			for(int b=0;b<4;b++){
				if(map[a][b]==0){//对方找可以填的位置,如果没有可以填的位置,表示自己失败了,即调用方胜利了
					for(int t=0;t<2;t++){
						map[a][b]=types[t];
						if(isWin(a,b,types[t])){//如果对方胜利了,则表示调用方失败了
							map[a][b]=0;//要还原
							return false;
						}
						map[a][b]=0;//要还原
					}
				}
			}
		}
		//当没有位置可以填的时候,表示调用方胜利了
		return true;
	}
	//合法性验证
	public static boolean validate(int i,int j,int type){	
		if(type==1){//测试垂直方向
			//向上边验证
			for(int k=i-1;k>=0;k--){
				if(map[k][j]==-type){
					break;
				}else if(map[k][j]==type){
					return false;
				}
			}
			//向下边验证
			for(int k=i+1;k<3;k++){
				if(map[k][j]==-type){
					break;
				}else if(map[k][j]==type){
					return false;
				}
			}
		}else{//验证水平方向
			//向左边验证
			for(int k=j-1;k>=0;k--){
				if(map[i][k]==-type){
					break;
				}else if(map[i][k]==type){
					return false;
				}
			}
			//向右边验证
			for(int k=j+1;k<4;k++){
				if(map[i][k]==-type){
					break;
				}else if(map[i][k]==type){
					return false;
				}
			}
		}
		return true;
	}
}
输入:(没有按题意的输入方式,只是一个测试数据)

1111
----
1000

输出:

211




java实现第三届蓝桥杯火柴游戏 火柴游戏 【编程题】(满分34分) 这是一个纵横火柴棒游戏。如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒。其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置)。 火柴棒的方向只能是竖直或水平放置。 火柴棒不能与其它格子中的火柴“连通”。所谓连通是指两根火柴棒可以连成一条直线,且中间没有其它不同方向的火柴“阻拦”。 例如:图[1.jpg]所示的局面... 阅读详情

相关推荐

蓝桥杯专题-真题版含答案-【扑克牌排列】【放麦子】【纵横放火柴游戏】【顺时针螺旋填入】

有真题,有答案,认认真真阅读,轻轻松松通过。蓝桥在等你。 有什么需要欢迎文章底部卡片私我,获取更多支持,交流让学习不再孤单

空名先生 1779

CCF-201803-4棋局评估

问题描述   Alice和Bob正在玩井字棋游戏。   井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格子时,游戏结束,该种棋子的持有者获胜。当棋盘被填满的时候,游戏结束,双方平手。   Alice设计了一种对棋局评分的方法:   - 对于Alice已经获胜的局面,评估得分为(棋盘上...

地球太危险了吧 725

火柴棍算式游戏

火柴棍算式游戏:移动一根火柴使算式成立。点击'?'按钮可显示答案。C++ VS2005

棋局评估(南航2022数据结构课设第八题/csp201803-4)

井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。不难看出这是一道模拟题,目的就是使双方每次的落子点都是当前的最优解,因为只是3*3的小棋盘,我们可以直接采取遍历所有可行的落子方案,然后返回当前最优解,这用递归的方法最好实现。每组数据输入有3行,每行有3个整数,用空格分隔,分别表示棋盘每个格子的状态。例如上图中的局面,Alice已经获胜,同时棋盘上有2个空格,所以局面得分为2+1=3。对于每组数据,输出一行一个整数,表示当前局面的得分。

青耕_的博客 659

java 拿火柴游戏

java 拿火柴游戏实验报告 里面含有源代码,可以运行,希望对您有所帮助

火柴棍小游戏java源码.rar

近日空虚,用java编写了一个火柴棍的小游戏。还是练练手。其中使用线程有些要改进,也想好了点,但现在很懒,不想写。例如线程中可以使用wait()方法,但本人没有用,这点可以加以改进。还有许多类似的情况。能力有限,仅供菜鸟参考。本人也属才菜鸟,呵呵。高手指点

CCF-CSP—2014.09.—4 棋局评估(搜索) 题解

题目来源:点击打开链接题目描述:问题描述  Alice和Bob正在玩井字棋游戏。  井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格子时,游戏结束,该种棋子的持有者获胜。当棋盘被填满的时候,游戏结束,双方平手。  Alice设计了一种对棋局评分的方法:  - 对于Alice已经获胜的局...

摇摇乐的博客 4067

VB6游戏源码:火柴棒游戏源码资料.rar

一款用VB6.0写小游戏,界面挺不错的,火柴棒游戏,可作为你学习VB6.0游戏编写的参考范例吧。游戏玩法:可拖动上边的火柴棒到游戏区,类似积木一样,可排出形状,可从外部调入解决方案,是一款益智类的VB小游戏,根据屏幕提示移动火柴棒排成一定形状,右键可以旋转火柴,玩之前首先要知道怎么玩才能写出游戏哦。本源码可学习一些VB游戏界面的布局、算法、游戏画面设计等方面的基本技巧。

第十三次CCF CSP认证(2018年3月)真题棋局评估

问题描述   Alice和Bob正在玩井字棋游戏。   井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格子时,游戏结束,该种棋子的持有者获胜。当棋盘被填满的时候,游戏结束,双方平手。   Alice设计了一种对棋局评分的方法:   - 对于Alice已经获胜的局面,评估得分为(...

徐奕的专栏 3918

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1222

stm32 Can通讯过滤器寄存器设置(实验验证)

起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。 解决: 在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:type

u013984214的专栏 3288

蓝桥杯:火柴游戏

这是一个纵横火柴棒游戏。 如图1,在3x4的格子中,游戏的双方轮流放置火柴棒。 其规则是: 不能放置在已经放置了火柴棒的地方(即只能在空格中放置)。 火柴棒的方向只能是竖直或水平放置。 火柴棒不能与其它格子中的火柴“连通”。 所谓连通是指两根火柴棒可以连成一条直线,且中间没有其它不同方向的火柴“阻拦”。 例如: 图1所示的局面下,可以在C2位置竖直放置(为了方便描述格子位置,图中左、下都添加了...

Buns.的博客 372

从零搭建智能视觉小车:OpenART图像处理+增强现实避坑指南

本文详细指导如何从零搭建智能视觉小车,重点介绍OpenART图像处理与增强现实技术在AprilTag识别中的应用。涵盖硬件选型、环境配置、算法优化及实战调试全流程,特别分享智能汽车竞赛中的避坑技巧和优化方案,帮助开发者构建稳定高效的视觉系统。

yhn456789的博客 1055

第三届蓝桥杯决赛 火柴游戏

【编程题】(满分34分)     这是一个纵横火柴棒游戏。如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒。其规则是:     1. 不能放置在已经放置火柴棒的地方(即只能在空格中放置)。     2. 火柴棒的方向只能是竖直或水平放置。     3. 火柴棒不能与其它格子中的火柴“连通”。所谓连通是指两根火柴棒可以连成一条直线,且中间没有其它

1078

STM32L452与FPGA通信翻车?手把手教你关闭I2C时钟延展避坑(附OVR错误解决方案)

本文深入解析STM32L452与FPGA在I2C通信中因时钟延展功能导致的常见问题,提供关闭I2C时钟延展的详细配置方法(NOSTRETCH模式),并针对可能出现的OVR错误给出Combined模式解决方案。通过实战案例和波形分析,帮助工程师快速排查和解决嵌入式系统中的I2C兼容性问题。

e3f4g5的博客 214

EEG信号分析实战:从时域到频域,手把手教你用Python处理脑电数据

本文详细介绍了使用Python进行EEG信号分析的实战方法,涵盖时域分析、频域分析和时频分析三大核心技术。通过MNE-Python等工具,读者将学习如何从原始脑电数据中提取事件相关电位(ERP),解码脑波节律特征,并运用时频分析追踪动态神经活动。教程包含完整的代码示例和认知科学解释,适合神经科学研究者快速掌握EEG分析全流程。

pink的博客 1007

13.蓝桥杯之纵横放火柴游戏

【编程题】(满分34分) 这是一个纵横火柴棒游戏。如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒。其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置)。 火柴棒的方向只能是竖直或水平放置。 火柴棒不能与其它格子中的火柴“连通”。所谓连通是指两根火柴棒可以连成一条直线, 且中间没有其它不同方向的火柴“阻拦”。 例如:图[1.jpg]所示的局面下,可以在C2位...

sword_anyone的博客 404

从Gotham到Foundry:拆解Palantir三大产品线,看它如何用‘本体’统一企业数据与AI

本文深入解析Palantir的三大产品线Gotham、Foundry和Apollo,揭示其如何通过独特的'本体'架构实现企业数据与AI的无缝融合。从国防情报到商业决策,Palantir的产品架构展现了强大的数据整合与AI赋能能力,为企业构建数字孪生提供革命性解决方案。

weixin_30823001的博客 321

火柴游戏-蓝桥杯

【编程题】(满分34分)     这是一个纵横火柴棒游戏。如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒。其规则是:     1. 不能放置在已经放置火柴棒的地方(即只能在空格中放置)。     2. 火柴棒的方向只能是竖直或水平放置。     3. 火柴棒不能与其它格子中的火柴“连通”。所谓连通是指两根火柴棒可以连成一条直线,且中间没有其它

张鹏宇的专栏 1412

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

复现CVE-2014-085(Apache ZooKeeper 未授权访问漏洞)

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。

记录并分享学习安全的知识点.. 2175

蓝桥杯 纵横放火柴游戏 寻找最优解

这是一个纵横火柴棒游戏。如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒。其规则是:       1. 不能放置在已经放置火柴棒的地方(即只能在空格中放置)。       2. 火柴棒的方向只能是竖直或水平放置。       3. 火柴棒不能与其它格子中的火柴“连通”。所谓连通是指两根火柴棒可以连成一条直线,且中间没有其它不同方向的火柴“阻拦”。  

colorfulshark 2052

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 蓝桥杯-排日程
下一篇: 代码集-字典树
KeepThinking_
博客等级 码龄15年 50粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值