java实现第三届蓝桥杯火柴游戏_普通网友的博客-程序员宝宝

技术标签: Java  算法练习题  火柴游戏  第三届蓝桥杯  

火柴游戏

【编程题】(满分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]);
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1439775520/article/details/97676868

智能推荐

ASP.NET CoreMVC 中的控制器_Cool2Feel的博客-程序员宝宝

Controller in ASP.NET Core MVC在本节中,我们将讨论 Controller 是什么以及它在 ASP.NET Core MVC 中的作用。Fiddler需要大家提前装一个工具,https://www.telerik.com/fiddlerFiddler 是一个 http 协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的 http 通讯,设置断点...

www.gvlib video.php,Car Universal/ GVIF Video Interface_微凉qazz的博客-程序员宝宝

Universal RGB video interface also called GVIF Video interface ,it comes with blue GVIF plug,which is compatible for car has GVIF connector.The multimedia video interface supporthigh definition RGB n...

计算机网络原理实验实验一:使用网络协议分析仪Wireshark_不会秃头的java开发工程师的博客-程序员宝宝

计算机网络原理实验实验一:使用网络协议分析仪Wireshark一、实验名称 使用网络协议分析仪Wireshark二、实验目的:掌握安装和配置网络协议分析仪Wireshark的方法;熟悉使用Wireshark工具分析网络协议的基本方法,加深对协议格式、协议层次和协议交互过程OICQ - IM software, popular in China的理解。三、实验内容和要求安装和配置网络协议分析仪Wireshark(http://www.wireshark.org);使用并熟悉Wiresha

Java swing创建按钮和标签及处理_qiu__hui的博客-程序员宝宝

//这段程序代码主要是为读者展示如何创建按钮组件和标签组件,并且将处理按钮组件的动作事件import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ButtonGroup;import javax.sw

skyeye配置文件_xuqianghit的博客-程序员宝宝

0px;width:100%;"> skyeye.conf是skyeye的配置文件,用来描述模拟的目标板的类型,内存分布,以及SkyEye的运行配置等等信息。事实上,你可以把想要让用户配置的选项都可以放在skyeye配置文件中。这样用户可以通过编辑skyeye.conf文件来比较灵活的选择仿真平台的功能和定制要模拟的目标板。还是从安装skyeye目录下的testsuit

ruby 读写文件_HPUZ的博客-程序员宝宝_ruby读文件

ruby 读写文件#Ruby 读取文件#方法一file = File.open("/Users/Desktop/demo.txt","r") while line = file.gets puts lineend#方法二File.open("/Users/Desktop/demo.txt","r").each_line do |line| puts lineend#Ruby 写

随便推点

java反射机制的调用_chifei1546的博客-程序员宝宝

import com.bootdo.common.config.collection.test.reflect.util.StringUtils;import groovy.transform.Undefined;import org.junit.Test;import jav...

ios HomeKit 开发指南_zzzzzdddddxxxxx的博客-程序员宝宝

本文由CocoaChina翻译组成员iBenjamin_Go和浅夏@旧时光翻译自苹果开发文档:HomeKit Developer Guide,敬请勘误。本文档内容包括第一部分:简介第二部分:启用HomeKit第三部分:创建Home布局第四部分:创建Homes和添加Accessories第五部分:观察HomeKit数据库的变化第六部分:访问

用户、角色、权限管理的数据库设计_chicha8453的博客-程序员宝宝

参考:http://blog.itpub.net/16436858/viewspace-627049/自己做的多个项目都没有做角色和权限的处理。虽然知道怎么做,但一直没有下手。恰好招到一篇言简意赅i参考文章。留档记录。:::用户表,(用于存储用户的所有信息)权限表,(用于存储所有的权...

centos7可以ping通内网,但ping不通外网_zhiji_dong的博客-程序员宝宝

首先检查添加DNS是否正常,如不存在则添加dns:[[email protected]]# vim /etc/resolv.confnameserver 114.114.114.114nameserver 8.8.8.8如果还是不行,可以尝试添加路由:(根据自己的网段设置,我的是192.168.11网段的!)[[email protected]]# route add default gw 192....

Trie前缀树_StephenYYYou的博客-程序员宝宝_try树

Trie前缀树简介Trie (发音为 "try") 又经常叫前缀树,字典树等等,是一种树数据结构,用于检索字符串数据集中的键。在计算机科学中,trie是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有...

通过七个简单的实验理解TCP/IP网络_shangrila_kun的博客-程序员宝宝

通过七个简单的实验理解TCP/IP网络LAN是什么的缩写语。LAN是Local Area Network(局域网)的缩略语。TCP/IP是什么的缩略语。TCP/IP是Transmission Control Protrol/Internet Protocol(传输控制协议和网际协议)的缩略语。MAC地址是什么。几乎所有的网卡都会在上市前被分配一个不可变更的MAC地...

推荐文章

热门文章

相关标签