求助, 过了三个测试点
  • 板块P1784 数独
  • 楼主cxcs
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/27 00:53
  • 上次更新2023/10/23 20:21:05
查看原帖
求助, 过了三个测试点
978815
cxcs楼主2023/3/27 00:53

人麻了, 同一道题 在头歌提交直接判超时, 在洛谷通过 前3个测试点,

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String [][]str = new String[9][];   // 使用字符串数组结束
		
		for(int i = 0; i < str.length; i++) {
			str[i] = sc.nextLine().split(" ");  // 整行接收
		}
		
		Main main = new Main();
		main.dfs(str, 0, 0);
	}
	
	public void dfs(String arr[][], int x, int y) {
		// 到达末尾
		if(x == 9) {
			print(arr);
			System.exit(0);
		}
		
		if(arr[x][y].equals("0")) {
			boolean loop;
			for(int i = 1; i <= 9; i++) {
				String num = "" + i;   // 转为string
				
				// 调用check验证 该数字是否合适
				loop = check(arr, x, y, num);
				if(loop) { 
					arr[x][y] = num;
					// 是否到该行末尾
					dfs(arr, x+ (y + 1) / 9, (y + 1) % 9);
					
				} 
			}
			// 循环结束 回溯
			arr[x][y] = "0";
			
		} else {
			dfs(arr, x+ (y + 1) / 9, (y + 1) % 9);
		}
	}
	
	
	public boolean check(String[][] arr, int x, int y, String num) {
		// 验证 行列是否有重复 数字
		for(int i = 0; i < 9; i++) {
			// 验证同一列
			if(arr[i][y].equals(num)) {
				return false;
			}
			// 同一行
			if(arr[x][i].equals(num)) {
				return false;
			}
		}
		
		// 验证 同一个小九宫格是否有 重复
		for(int i = (x / 3)*3; i < (x / 3 + 1)*3; i++) {
			for(int j = (y / 3)*3; j < (y / 3 + 1)*3; j++) {
				if(arr[i][j].equals(num))
					return false;
			}
		}
		
		return true;
	}
	
	// 遍历输出方法
	public void print(String [][]arr) {
		for(int i = 0; i < arr.length; i++) {
			for(int j = 0; j < arr[i].length; j++) {
				if(j == 8) {
					System.out.print(arr[i][j]);
				} else {
					System.out.print(arr[i][j] + " ");
				}
			}
			System.out.println();
		}
	}
	
}
2023/3/27 00:53
加载中...