五子棋赢了吗?(简易判断)java

假设五子棋的棋盘是N * N的(正整数N<20),黑子用*表示,白子用#表示,空位置用. 表示。

现给你一个棋局,请判断黑子是否获胜,如获胜,显示Win,并给出获胜排列的最左边那列的最上方那颗棋子的坐标。(棋盘左上角坐标是 (0, 0) ,右下角坐标是 (N-1, N-1)

如果未获胜,则显示“Not yet”。

注意:

  • 不考虑白子是否获胜以及棋子个数与黑子是否匹配,只考虑黑子排列
  • 为简化计算,不用考虑“活四”、“四三连”、“长连”、“三三连”等获胜或禁手条件,只判断黑子有5个(或更多)排成一条直线,包括横线、竖线或斜线为胜利条件
  • 输入保证最多只出现一处黑子胜利的排列,不需要考虑有多处排列时如何判断最左位置。

输入格式:

第一行是正整数N(N<20),接下来是表示棋盘排列的N行字符,每行有N*#.字符。

输出格式:

若黑子(用*表示)获胜,打印一行字符,依次是 Win X Y ,其中X Y是黑子获胜排列的最左边那列的最上方的一颗棋子的坐标,X表示横坐标,Y表示纵坐标。

若黑子未获胜,打印一行: Not yet 。

输入样例1:

6
.***..
..#...
..#...
......
....*.
.....*

输出样例1:

Not yet

输入样例2:

7
..#....
..#....
..#..*.
..#.*..
..#*...
..*..##
.*.****

输出样例2:

Win 1 6

 

import java.util.Scanner;

public class Main {
	static char[][] pan = new char[21][21];

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n;
		int i, j;
		n = sc.nextInt();
		String str;
		for (i = 0; i < n; i++) {
			str = sc.next();
			for (j = 0; j < n; j++) {
				pan[i][j] = str.charAt(j);
			}
		}
		for (i = 0; i < n; i++) {
			for (j = 0; j < n; j++) {
				if (pan[i][j] == '*') {
					//打横判断
					if (j + 4 < n && pan[i][j + 1] == '*' && pan[i][j + 2] == '*'
							&& pan[i][j + 3] == '*' && pan[i][j + 4] == '*') {
						System.out.printf("Win %d %d", j, i);
					}

					//打竖判断
					if (i + 4 < n && pan[i + 1][j] == '*' && pan[i + 2][j] == '*'
							&& pan[i + 3][j] == '*' && pan[i + 4][j] == '*') {
						System.out.printf("Win %d %d", j, i);
						return;
					}

					//斜右下判断
					if (i + 4 < n && j + 4 < n && pan[i + 1][j + 1] == '*' && pan[i + 2][j + 2] == '*'
							&& pan[i + 3][j + 3] == '*' && pan[i + 4][j + 4] == '*') {
						System.out.printf("Win %d %d", j, i);
						return;
					}

					//斜左下判断
					if (i + 4 < n && j - 4 < n && pan[i + 1][j - 1] == '*' && pan[i + 2][j - 2] == '*'
							&& pan[i + 3][j - 3] == '*' && pan[i + 4][j - 4] == '*') {
						System.out.printf("Win %d %d", j - 4, i + 4);
						return;
					}
				}
			}
		}
		System.out.printf("Not yet");
		sc.close();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值