【编程题】

这是一个纵横火柴棒游戏。如图[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也是正解。


import java.util.*;
import java.io.*; public class Matchstick
{
private char[][] data; public Matchstick(char[][] data)
{
this.data = data;
} // 判断放法的可行性
private boolean isGoodStep(int i, int j, char c)
{
// 本格为空闲吗?
if(data[i][j] != '0') return false; data[i][j] = c;
try
{
String s = "";
if(c=='1')
s = s + data[0][j] + data[1][j] + data[2][j];
else
s = s + data[i][0] + data[i][1] + data[i][2] + data[i][3]; s = s.replaceAll("0",""); if(s.indexOf(""+c+c)>=0) return false;
}
finally
{
data[i][j] = '0';
} return true;
} // 一步试放
// 在第i行,第j列 试放 c
// 必赢,则返回此着法;不能放置或放了必输则返回null
private String tryStep(int i, int j, char c)
{
if(isGoodStep(i,j,c))
{
data[i][j] = c;
try
{
if(f()==null) return i + "," + j + "," + c;
}
finally
{
data[i][j] = '0';
}
}
return null;
} // 评价data局面
// 如果必输,返回null
// 如果必赢,返回必赢的着法之一
public String f()
{
for(int i=0; i<3; i++)
for(int j=0; j<4; j++)
{
String rt = null; rt = tryStep(i,j,'1');
if(rt!=null) return rt; rt = tryStep(i,j,'-');
if(rt!=null) return rt;
}
return null;
} private static char[][][] readData() throws IOException
{
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
char[][][] rt = new char[n][3][4]; for(int k=0; k<n; k++)
{
for(int i=0; i<3; i++)
{
String s = scan.nextLine().trim();
for(int j=0; j<4; j++)
rt[k][i][j] = s.charAt(j);
}
} return rt;
} static private void writeResult(String[] ss)
{
for(int i=0; i<ss.length; i++)
{
if(ss[i]==null)
System.out.println("000"); // 权宜之计,应该选择某个可行的走法
else
System.out.println(ss[i].replaceAll(",",""));
}
} public static void main(String[] args) throws Exception
{
// 局面
//char[][] a = {{'0','1','1','0'},{'-','0','0','0'},{'-','0','0','0'}};
//char[][] a = {{'-','0','0','0'},{'0','0','0','0'},{'0','0','0','0'}}; char[][][] a = readData();
String[] b = new String[a.length]; for(int i=0; i<a.length; i++)
{
b[i] = new Matchstick(a[i]).f();
} writeResult(b);
}
}

java实现纵横火柴棋的更多相关文章

  1. Java实现去火柴游戏

    package com.gh.p10; /** * Created by Lenovo on 2014/12/10. */ import java.util.Random; import java.u ...

  2. java实现第三届蓝桥杯火柴游戏

    火柴游戏 [编程题](满分34分) 这是一个纵横火柴棒游戏.如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒.其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 火柴棒的 ...

  3. 蓝桥杯java历年真题及答案整理1~20.md

    蓝桥杯java历年真题及答案整理(闭关一个月,呕心沥血整理出来的) 1 算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种.如:给定 A.B.C三个不同的字符,则结果为:A ...

  4. 算法笔记_201:第三届蓝桥杯软件类决赛真题(Java本科)

    目录 1 数量周期 2 提取子串 3 源码变换 4 古代赌局 5 火柴游戏   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简 ...

  5. Java 征途:行者的地图

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...

  6. [转]Java 征途:行者的地图

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...

  7. Java 征途:行者的地图 (转)

    http://www.cnblogs.com/mindwind/p/5251430.html Java 征途:行者的地图   前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走 ...

  8. 用Java开发50个棋类游戏

    眼下已经开发完了两个 1A2B 24点 打算开发以下的.直接在QQ上玩. QQ机器人已经有了.我们直接写业务即可.有兴趣的參与.机器人婷婷体验群 Java技术交流 207224939 四棋 小枪大炮 ...

  9. java的征途

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大 约在 2003 年我开始知道 Java 的(当时还在用 Delp ...

随机推荐

  1. 帝国cms列表页内容简介字段smalltext去除里面html格式代码 设置方法

    帝国cms列表页内容简介字段smalltext去除里面html格式代码帝国cms列表页调用内容简介出现html代码怎么办 近来在用帝国cms的时候,发现一个问题,在列表页调用产品简介的时候出现了这种h ...

  2. Django使用channel实现websocket

    channel 什么是channel? channel是第三方工具包,对于不支持websocket协议的框架可以借助此包实现websocket 安装 终端安装: pip3 install channe ...

  3. springDataJPQL实现增删改查及分页,原生sql查询,根据方法命名规则实现查询以及Specification查询

    一.使用方法 1.在dao中定义开一个方法,使用方法的参数设置jpql,并且使用方法的返回值接受查询结果,在方法上添加@query注解,在注解中写jpql语句进行增删改查,测试 2.使用原生的sql语 ...

  4. 初识spring boot maven管理--配置文件

    web环境下修改信息需要重启服务器,如果在一个大型的项目中经常重启服务器,那浪费的时间可想而知,今天介绍个好东西 --spring boot!一般学习都是从hello world开始学习的!下面介绍s ...

  5. Spring Boot集成H2数据库

    需求 平时学习的时候,涉及到一些连接数据库相关的操作,经常需要初始化本地数据库,比如装个MySQL,初始化一些脚本,比较麻烦,H2是内存数据库,Spring Boot可以在应用启动的时候对H2数据库初 ...

  6. matlab第六章数据分析与多项式计算

    MATLAB练习 第六章数据分析与多项式计算 1.max和min 1.分别求矩阵A中各列和各行元素中的最大值.max和min的用法一样 % [例6.1]分别求矩阵中各列和各行元素中的最大值. A=[5 ...

  7. kubernetes pod的弹性伸缩———基于pod自定义custom metrics(容器的IO带宽)的HPA

    背景 ​ 自Kubernetes 1.11版本起,K8s资源采集指标由Resource Metrics API(Metrics Server 实现)和Custom metrics api(Promet ...

  8. MySQL slave状态之Seconds_Behind_Master zz

    在MySQL的主从环境中,我们可以通过在slave上执行show slave status来查看slave的一些状态信息,其中有一个比较重要的参数Seconds_Behind_Master.那么你是否 ...

  9. mysql 优化(包含sql语句的书写)

    http://blog.chinaunix.net/uid-11640640-id-3426908.html  mysql性能优化-慢查询分析.优化索引和配置 2012-11-30 15:18:42 ...

  10. unity---string.Format()

    string.Format用法 string.Format("{0}{1}{2}",str1,str2,str3) string.Format("{0:D2}{1:D2} ...