三道模拟题

    1. 锯齿数独

    学会输入输出
    回溯 复习了解数独
    image.png
    image.png

    1. import java.util.Scanner;
    2. public class test {
    3. static int count = 0;
    4. public static void main(String[] args) {
    5. Scanner scan = new Scanner(System.in);
    6. //读取案例数
    7. int num = scan.nextInt();
    8. int[][] qipan = new int[3][3];
    9. int[][] gong = new int[3][3];
    10. for (int n = 0; n < num; ++n) {
    11. for (int i = 0; i < 3; ++i) {
    12. String tmp = scan.next();
    13. for (int j = 0; j < tmp.length(); ++j) {
    14. if (tmp.charAt(j) != '*') qipan[i][j] = tmp.charAt(j) - '0';
    15. }
    16. }
    17. for (int i = 0; i < 3; ++i) {
    18. for (int j = 0; j < 3; ++j) {
    19. int x = scan.nextInt();
    20. int y = scan.nextInt();
    21. gong[x][y] = i;
    22. }
    23. }
    24. boolean res = backTrack(qipan, gong);
    25. System.out.println(count);
    26. }
    27. }
    28. private static boolean isValidSudoku(int row, int col, int val, int[][] board, int[][] gong){
    29. // 同行是否重复
    30. for (int i = 0; i < 3; i++){
    31. if (board[row][i] == val){
    32. return false;
    33. }
    34. }
    35. // 同列是否重复
    36. for (int j = 0; j < 3; j++){
    37. if (board[j][col] == val){
    38. return false;
    39. }
    40. }
    41. // 宫格里是否重复
    42. int gongHao = gong[row][col];
    43. for (int i = 0; i < 3; ++i) {
    44. for (int j = 0; j < 3; ++j) {
    45. if (gongHao == gong[i][j]) {
    46. if (board[i][j] == val) return false;
    47. }
    48. }
    49. }
    50. return true;
    51. }
    52. public static boolean backTrack(int[][] qipan, int[][] gong) {
    53. for (int i = 0; i < 3; ++i) {
    54. for (int j = 0; j < 3; ++j) {
    55. if (qipan[i][j] != 0) continue;
    56. for (int k = 1; k <= 3; ++k) {
    57. if (isValidSudoku(i, j, k, qipan, gong)) {
    58. qipan[i][j] = k;
    59. if (backTrack(qipan, gong)) {
    60. //输出棋盘
    61. //for (int m = 0; m < 3; ++m) {
    62. // for (int n = 0; n < 3; ++n) {
    63. // System.out.print(qipan[m][n]);
    64. // }
    65. // System.out.println();
    66. //}
    67. count++;
    68. }
    69. qipan[i][j] = 0;
    70. }
    71. }
    72. return false;
    73. }
    74. }
    75. return true;
    76. }
    77. }
    1. 黑白棋

    used[][]数组,存放是否棋子刚刚被反转过
    used[x][y] == 0 可以反转
    反转过棋子以后 置1,used[x][y] == 1
    在下一次下棋之前(for循环的最后,将所有1置2,将所有2置0)
    image.png
    image.png

    1. 战旗