火柴游戏

【编程题】(满分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. git 常用 指令累积

    1.查询指定文件的修改所有修改日志git log --pretty=oneline 文件名 1. git log filename 可以看到fileName相关的commit记录2. git log ...

  2. 这或许是最详细的JUC多线程并发总结

    多线程进阶---JUC并发编程 完整代码传送门,见文章末尾 1.Lock锁(重点) 传统 Synchronizd package com.godfrey.demo01; /** * descripti ...

  3. php5.2安装memcached 扩展

    需要注意版本号,好坑. libmemcached release 1.0.16 - installed from sourcephp-memcached release 2.1.0 - install ...

  4. poj2112 网络流+二分答案

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18083   Accepted: 6460 ...

  5. 【MySQL】MyISAM和InnoDB存储引擎区别详解

    MyISAM 主键索引(引擎的索引文件和数据文件是分离的) (图片来自:https://blog.csdn.net/u010922732/article/details/82994253) 非主键索引 ...

  6. 【python爬虫】scrapy入门6-生成多个spider

    一个工程生产一个spider,也可以多个spider,比如一个爬文本,一个爬图片等 cd tutorial #自己创建的工程目录 scrapy genspider test1 test1.com sc ...

  7. Java 面向对象基础

    面向对象的基础 局部变量和成员变量区别: 1)定义的位置不同    成员变量直接定义在class中    局部变量在某个{}中或者再某个方法中 2)在内存中的位置不同    对象的成员变量会在内存中的 ...

  8. ios时间显示NaN

    问题是当时js里时间是这种格式的 2016-09-07 16:37:50 用var time = obj.replace(/\-/g, "/");将格式改成 2016/09/07 ...

  9. web自动化之Select标签操作

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  10. 【书签】连续型特征的归一化和离散特征的one-hot编码

    1. 连续型特征的常用的归一化方法.离散型特征one-hot编码的意义 2. 度量特征之间的相关性:余弦相似度和皮尔逊相关系数