2013年6月3日 星期一

圍棋算氣程式

Java code:
import java.util.Scanner;

public class Chi {
    static int[][] board = new int[19][19];
    static boolean[][] gone = new boolean[19][19];
    static boolean[][] isCount = new boolean[19][19];
    static int chessColor;
    static int chiNum = 0;
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x, y;
        
        try {
            System.out.println("請輸入棋盤:");
            for (int i=0; i<board.length; i++) {
                for (int j=0; j<board[i].length; j++)
                    board[i][j] = sc.nextInt();
            }
            System.out.print("請輸入座標: ");
            x = sc.nextInt();
            y = sc.nextInt();
        } finally {
            sc.close();
        }
        if (board[x][y] == 0)
            System.out.println("這個座標沒有任何棋子");
        else {
            chessColor = board[x][y];
            countChi(x, y);
            if (chessColor == 1)
                System.out.println("您算的是黑子的氣");
            else
                System.out.println("您算的是白子的氣");
            System.out.println("共有" + chiNum + "個氣");
        }
    }

    private static void countChi(int x, int y) {
        if (board[x][y] == 0 && !isCount[x][y]) {
            chiNum++;
            isCount[x][y] = true;
        }
        else if (!gone[x][y] && board[x][y] == chessColor) {
            gone[x][y] = true;
            countChi(x - 1, y);
            countChi(x, y - 1);
            countChi(x, y + 1);
            countChi(x + 1, y);
            gone[x][y] = false;
        }
    }
}

範例輸入輸出:



這是老師出的額外題目,題目的要求是輸入一個棋盤,並且指定一個座標,並算出指定座標棋子所在區域的氣。此程式會自動辨識您指定的座標是黑子區域還是白子區域,若您指定黑子就會為您算出黑子的氣;若您指定白子就會為您算出白子的氣,若您指定的地方沒有任何棋子,程式會告訴您這地方沒有任何棋子。此程式的作法就是不斷地搜尋這區域周圍的氣(也就是沒有任何棋子的地方),若已經搜尋過得地方用gone這個布林陣列把它記起來,以避免無限的搜尋,若找到氣了,就把氣數+1然後用布林陣列記住這個地方已經算過氣了,避免未來再重複算一次。
此程式的輸入為一個19 * 19的棋盤,0代表沒有棋子, 1代表黑棋, 2代表白棋,完成後程式會要求您輸入一個座標,格式為(x y),x和y的範圍皆為0~18。輸出為你算的是什麼棋子的氣,以及總共是多少氣。

沒有留言:

張貼留言