L1-104 九宫格 - java

题目解析

判断给定的九宫格是否符合游戏规则。

解题思路

这个九宫格其实就是数独,需要判断数独是否合法。
当前这一行,这一列,这一九宫格是否有重复。有重复则不合法,否则为合法。

可以用二进制来判断,当前这一类(一行,一列,九宫格)中的数字是否有相同。

通过位运算 (与&) 判断当前这个数是否存在于当前这一类中
将当前这个数加到这一类的判断中

代码

import java.io.*;
import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		int t = sc.nextInt();
		while (t-- > 0)
		{
			int shu[] = new int[9 * 3 + 10]; // 以二进制的方式存储每一行,每一列,每一个九宫格中的数

			int f = 1; // 是否符合
			for (int i = 0; i < 9; i++)
			{
				for (int j = 0; j < 9; j++)
				{
					int x = sc.nextInt();
					if (x > 9 || x < 1) f = 0; // 当前这个数,不符合规定

					if ((shu[0 * 9 + i] & (1 << x)) != 0) f = 0; // 如果当前这一行出现了重复,则不符合
					shu[0 * 9 + i] += 1 << x; // 当前这一行加上这个数

					if ((shu[1 * 9 + j] & (1 << x)) != 0) f = 0; // 如果当前这一列出现了重复,则不符合
					shu[1 * 9 + j] += 1 << x; // 当前这一列加上这个数

					if ((shu[2 * 9 + i / 3 * 3 + j / 3] & (1 << x)) != 0) f = 0; // 如果当前这一九宫格出现了重复,则不符合
					shu[2 * 9 + i / 3 * 3 + j / 3] += 1 << x; // 当前这一九宫格加上这个数
				}
			}

			out.println(f);
		}

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);

}


团体程序设计天梯赛-练习集-java

赞赏