zoukankan      html  css  js  c++  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]);
        }
    }
    
  • 相关阅读:
    Linux如何设置时区/时间/上海时间
    Anaconda Python3.7环境 import _ssl DLL load failed(ImportError:DLL load failed:找不到指定模块)
    一行命令搞定/usr/bin/perl^M: bad interpreter
    Embed MP4 in HTML using flash-player(html5 video player)
    mp4文件转码为m3u8
    Python 下载图片的三种方法
    图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了
    DOS批处理中%~dp0表示什么意思
    Android学习探索之App多渠道打包及动态添加修改资源属性
    Android学习探索之运用MVP设计模式实现项目解耦
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13076810.html
Copyright © 2011-2022 走看看