三道模拟题
- 锯齿数独
学会输入输出
回溯 复习了解数独
import java.util.Scanner;
public class test {
static int count = 0;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//读取案例数
int num = scan.nextInt();
int[][] qipan = new int[3][3];
int[][] gong = new int[3][3];
for (int n = 0; n < num; ++n) {
for (int i = 0; i < 3; ++i) {
String tmp = scan.next();
for (int j = 0; j < tmp.length(); ++j) {
if (tmp.charAt(j) != '*') qipan[i][j] = tmp.charAt(j) - '0';
}
}
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
int x = scan.nextInt();
int y = scan.nextInt();
gong[x][y] = i;
}
}
boolean res = backTrack(qipan, gong);
System.out.println(count);
}
}
private static boolean isValidSudoku(int row, int col, int val, int[][] board, int[][] gong){
// 同行是否重复
for (int i = 0; i < 3; i++){
if (board[row][i] == val){
return false;
}
}
// 同列是否重复
for (int j = 0; j < 3; j++){
if (board[j][col] == val){
return false;
}
}
// 宫格里是否重复
int gongHao = gong[row][col];
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (gongHao == gong[i][j]) {
if (board[i][j] == val) return false;
}
}
}
return true;
}
public static boolean backTrack(int[][] qipan, int[][] gong) {
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (qipan[i][j] != 0) continue;
for (int k = 1; k <= 3; ++k) {
if (isValidSudoku(i, j, k, qipan, gong)) {
qipan[i][j] = k;
if (backTrack(qipan, gong)) {
//输出棋盘
//for (int m = 0; m < 3; ++m) {
// for (int n = 0; n < 3; ++n) {
// System.out.print(qipan[m][n]);
// }
// System.out.println();
//}
count++;
}
qipan[i][j] = 0;
}
}
return false;
}
}
return true;
}
}
- 黑白棋
used[][]数组,存放是否棋子刚刚被反转过
used[x][y] == 0 可以反转
反转过棋子以后 置1,used[x][y] == 1
在下一次下棋之前(for循环的最后,将所有1置2,将所有2置0)
- 战旗