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]);
    }
}
posted @ 2019-07-29 20:22  南墙1  阅读(44)  评论(0编辑  收藏  举报