求助,最后一个测试点TLE
  • 板块P1784 数独
  • 楼主ryanzh
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/5/7 16:09
  • 上次更新2023/10/23 16:25:18
查看原帖
求助,最后一个测试点TLE
790691
ryanzh楼主2023/5/7 16:09
#include <bits/stdc++.h>
using namespace std;
const int N = 9;
int a[N][N];
// 判断元素是否可以填在(row, col)位置
bool check(int row, int col, int num)
{
    // 判断行和列是否有重复数字
    for (int i = 0; i < N; i++) 
        if (a[row][i] == num || a[i][col] == num) 
            return false;
    // 判断3x3的方格内是否有重复数字
    int r = row / 3 * 3;
    int c = col / 3 * 3;
    for (int i = r; i < r + 3; i++) 
        for (int j = c; j < c + 3; j++) 
            if (a[i][j] == num) 
                return false;
    return true;
}

// 递归求解
bool dfs(int row, int col)
{
    // 如果行到达N,即全部求解完毕,返回true
    if (row == N) 
        return true;
    // 如果列到达N,计算下一行的数
    if (col == N) 
        return dfs(row + 1, 0);
    // 如果这个位置已经有数字,计算下一个位置的数
    if (a[row][col] != 0)
        return dfs(row, col + 1);
    // 枚举1-9的数字
    for (int i = 1; i <= 9; i++) 
	{
        // 判断该数字是否可以填在这个位置
        if (check(row, col, i)) 
		{
            a[row][col] = i;
            // 如果下一个位置也可行,返回true,表示可以求解
            if (dfs(row, col + 1)) 
                return true;
            a[row][col] = 0;
        }
    }
    return false;// 如果所有数字都不能填入该位置,返回false
}
int main()
{
    for (int i = 0; i < N; i++) 
        for (int j = 0; j < N; j++) 
            scanf("%d", &a[i][j]);
            
    if (dfs(0, 0)) 
        for (int i = 0; i < N; i++) 
		{
            for (int j = 0; j < N; j++) 
                printf("%d ", a[i][j]);
            printf("\n");
        }
    return 0;
}
2023/5/7 16:09
加载中...