火柴游戏

【编程题】(满分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. Python --函数学习2

    一.函数参数和返回值 --参数:负责给函数传递一些必要的数据或者信息 -形参(形式参数):在函数定义的时候用到的参数,没有具体值,只是一个占位符号 -实参(实际参数):在调用函数的时候输入的值 exa ...

  2. strcmp比较字符串

    0x01 <?php $flag = "flag{xxxxx}"; if (isset($_GET['a'])) { if (strcmp($_GET['a'], $flag ...

  3. Flutter RenderBox指南——绘制篇

    本文基于1.12.13+hotfix.8版本源码分析. 0.大纲 RenderBox的用法 通过RenderObjectWidget把RenderBox塞进界面 1.RenderBox 在flutte ...

  4. OpenCV开发笔记(五十六):红胖子8分钟带你深入了解多种图形拟合逼近轮廓(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. 搞懂:MVVM模型以及VUE中的数据绑定数据劫持发布订阅模式

    搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : model - view - viewmodel的缩写,说都能直接说出来 model:模型,view:视图,view-Model:视 ...

  6. Redux:异步操作

    最近状态不太好,学习redux的异步操作花的时间比想象的多,这里尽量清晰简要的表述一下在redux中怎么实现异步操作. 先回顾一下同步操作: 我们用redux执行同步的时候,都是先发起一个dispat ...

  7. storm-jdbc详解

    今天来说说Storm集成Jdbc是如何完成的,代码如下: 写入数据: 先来讲讲官方API: Map hikariConfigMap = Maps.newHashMap(); hikariConfigM ...

  8. MVC4.0 上传文件

    Views/Import/ImportExcel.cshtml @{ Layout = null;} <!DOCTYPE html> <html><head> &l ...

  9. 约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)

    圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0 ...

  10. vue项目中关闭eslint的方法

    非常简单的操作方法!不用再去为了烦人的代码标准报错而苦恼了! 方法一:在项目根目录下增加 vue.config.js 文件 添加以下代码: module.exports = { lintOnSave: ...