火柴游戏

【编程题】(满分34分)

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

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

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

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

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

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

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

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

如图[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也是正解。

【注意】

请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

import java.util.Scanner;

public class Main {
public static String[] result; public char[] check(char[][] map, int i, int j) {
char[] r = {'+', '+'};
//检测行
boolean ring = true;
if(j == 0) {
if(map[i][j + 1] == '-' || (map[i][j + 1] == '0' && map[i][j + 2] == '-'))
ring = false;
} else if(j == 1) {
if(map[i][j - 1] == '-' || map[i][j + 1] == '-')
ring = false;
} else if(j == 2) {
if(map[i][j - 1] == '-' || (map[i][j - 1] == '0' && map[i][j - 2] == '-'))
ring = false;
}
//检测列
boolean row = true;
if(i == 0) {
if(map[i + 1][j] == '1' || (map[i + 1][j] == '0' && map[i + 2][j] == '1'))
row = false;
} else if(i == 1) {
if(map[i - 1][j] == '1' || map[i - 1][j] == '1')
row = false;
} else if(i == 2) {
if(map[i - 1][j] == '1' || (map[i - 1][j] == '0' && map[i - 2][j] == '1'))
row = false;
} if(ring == true && row == true) {
r[0] = '1';
r[1] = '-';
}
if(ring == true && row == false) {
r[0] = '-';
r[1] = '+';
}
if(ring == false && row == true) {
r[0] = '1';
r[1] = '+';
}
if(ring == false && row == false){
r[0] = '+';
r[1] = '+';
}
return r;
} public int getCount(char[][] tempMap) {
int count = 0;
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++) {
char[] r = check(tempMap, i, j);
if(r[0] != '+')
count++;
}
return count;
} public void getResult(char[][] map, int x) {
char[][] tempMap = new char[3][3];
int min = Integer.MAX_VALUE;
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++)
tempMap[i][j] = map[i][j];
for(int i = 0;i < 3;i++) {
for(int j = 0;j < 3;j++) {
if(map[i][j] == '0') {
char[] r = check(map, i, j);
for(int k = 0;k < 2;k++) {
if(r[k] != '+') {
tempMap[i][j] = r[k];
int count = getCount(tempMap);
tempMap[i][j] = '0';
if(count < min) {
min = count;
result[x] = "" + i+ j + r[k];
}
}
}
}
}
}
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
result = new String[n];
for(int i = 0;i < n;i++) {
char[][] map = new char[3][3];
String[] temp = new String[3];
for(int j = 0;j < 3;j++) {
temp[j] = in.next();
map[j] = temp[j].toCharArray();
}
test.getResult(map, i);
}
for(int i = 0;i < result.length;i++)
System.out.println(result[i]);
}
}

java实现第三届蓝桥杯火柴游戏的更多相关文章

  1. java实现第三届蓝桥杯方块填数

    方块填数 "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为6个部 ...

  2. java实现第八届蓝桥杯生命游戏

    生命游戏 题目描述 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的 ...

  3. java实现第三届蓝桥杯DNA对比

    DNA对比 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C. ...

  4. java实现第三届蓝桥杯拼音字母

    拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...

  5. java实现第三届蓝桥杯源码变换

    源码变换 这道题因为有一些html语言在编写的时候不会显示出来,所以就用代码格式把题目写出来 [编程题](满分22分) 超文本标记语言(即HTML),是用于描述网页文档的一种标记语言. HTML通过文 ...

  6. java实现第三届蓝桥杯排日程

    排日程 [编程题](满分34分) 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天. 上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更. 此外,由于工作需要,还有如 ...

  7. java实现第三届蓝桥杯机器人行走

    机器人行走 [编程题](满分18分) 某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). ...

  8. java实现第三届蓝桥杯地址格式转换

    地址格式转换 [编程题](满分21分) Excel是最常用的办公软件.每个单元格都有唯一的地址表示.比如:第12行第4列表示为:"D12",第5行第255列表示为"IU5 ...

  9. java实现第三届蓝桥杯数据压缩

    数据压缩 某工业监控设备不断发回采样数据.每个数据是一个整数(0到1000之间).各个数据间用空白字符(空格,TAB或回车换行)分隔.这些数据以文本形式被存储在文件中. 因为大多数时候,相邻的采样间隔 ...

随机推荐

  1. 如何在一台计算机上安装多个 JDK 版本

    前言 对于使用 Java 语言开发的朋友可能会遇到这种情况,有时想学习和探索 Java 的最新版本提供的一些新特性,比如 Java 11,但你无法将其安装在自己的计算机上,因为你的团队正在使用比这个旧 ...

  2. python--封装Redis

    Redis封装 import redis class MyRedis():    def __init__(self,ip,password,port=6379,db=1):#构造函数         ...

  3. sqlite聚合函数

    常见聚合函数 avg(X) 用于返回组中所有非空列的平均值.字符串(string)或二进制数据(BLOB)等非数字类型当作0来计算.结果是浮点型的数据,即便所有数据中只有一个整数(integer)的数 ...

  4. LUNIX命令集

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户.多任务.支持多线程和多 CPU 的操作系统. Linux 能运行主要的 UNIX 工具软件 ...

  5. 【python深度学习】KS,KL,JS散度 衡量两组数据是否同分布

    目录 KS(不需要两组数据相同shape) JS散度(需要两组数据同shape) KS(不需要两组数据相同shape) 奇怪之处:有的地方也叫KL KS距离,相对熵,KS散度 当P(x)和Q(x)的相 ...

  6. 数据结构----栈stack

    栈的概念与数据结构 栈(有时称为“后进先出栈”)是一个元素的有序集合,其中添加移除新元素总发生在同一端.这一端通常称为“顶部”.与顶部对应的端称为“底部”.栈的底部很重要,因为在栈中靠近底部的元素是存 ...

  7. 02.drf不使用serializers返回数据

    drf 可以使用不经过model和serialzier的数据返回,也可以配置权限 class DashboardStatusViewset(viewsets.ViewSet): "" ...

  8. 基于SpringCloud分布式架构

    基于SpringCloud分布式架构 为什么要使用分布式架构 Spring Cloud 专注于提供良好的开箱即用经验的典型用例和可扩展性机制覆盖 分布式/版本化配置 服务注册和发现 路由 Servic ...

  9. 【Redis】String应用场景

    单值缓存 SET key value GET key 对象缓存 SET user: value(json格式数据) MSET user::name value1 user::balance value ...

  10. 【python爬虫】scrapy入门7:Scrapy中runspider和crawl的区别

    runspider:不依赖创建项目 命令:scrapy runspider myspider.py  等同于  pyhton myspider.py crawl:使用spider进行爬取,依赖项目创建 ...