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]);
        }
    }
    
  • 相关阅读:
    To select the file to upload we can use the standard HTML input control of type
    Cascading Menu Script using Javascript Explained
    网站首页head区代码规范
    轻松掌握 Java 泛型
    JDK 5.0 中的泛型类型学习
    如何在firefox下获取下列框选中option的text
    是同步方法还是 synchronized 代码? 详解多线程同步规则
    javascript select option对象总结
    Select的动态取值(Text,value),添加,删除。兼容IE,FireFox
    javascript在ie和firefox下的一些差异
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077120.html
Copyright © 2011-2022 走看看