【POJ-2676】Sudoku

126 阅读1分钟

题目

九宫格问题,也有人叫数独问题。给你一个数独,让你填数:

  1. 每行的九个数字互不相同;
  2. 每列的九个数字各不相同;
  3. 被分成的3*3的小矩阵中的九个数字互不相同;

输出完成后的数表,若不能满足上述条件,则输出原图。




样例

样例输入
1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107


样例输出
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127



AC代码

#include <stdio.h>
#include <iostream>

using namespace std;

int sum, map[12][12];
int flag = 0;
int p[100];

int input() //输入
{
    sum = 0; // 记录行数
    string str;
    int i, j;
    for (i = 1; i <= 9; i++) // 有9行输入
    {
        cin >> str;              // 每一行用一个字符串代表
        str.insert(0, 1, '$');   // 因为字符串的输入时从第0位输入的,我们的程序又想便于分析而从第一位计算,所以使用insert函数人为的在第0位插入一个字符$,后面的字符依次后移。  string.insert()函数的用法:https://www.cnblogs.com/mxw000120/p/13835219.html
        for (j = 1; j <= 9; j++) // 这一层循环的作用是寻找字符'0'的位置
        {
            if (str[j] == '0')
                p[sum++] = i * 10 + j; //记录这一行字符'0'出现的位置
            map[i][j] = str[j] - '0';  //正常的数字
        }
    }
}

//输出
void output()
{
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= 9; j++)
        {
            cout << map[i][j];
        }
        cout << endl;
    }
}
int check(int res, int x, int y) // 判断
{
    //进行行列判断
    for (int i = 1; i <= 9; i++)
    {
        if (res == map[x][i] || res == map[i][y])
            return 0;
    }
    x = (x - 1) / 3 * 3 + 1;
    y = (y - 1) / 3 * 3 + 1;
    // 小9方格内判断
    for (int i = x; i <= x + 2; i++)
        for (int j = y; j <= y + 2; j++)
            if (res == map[i][j])
                return 0;
    return 1;
}
void dfs(int k)
{
    //找到字符'0'的位置,从那里开始搜索
    int x = p[k] / 10;
    int y = p[k] % 10;

    // sum为一个样例中'0'的个数。如果所有的字符'0'都已处理完毕,则可以输出这个矩阵了
    if (k == sum)
    {
        flag = 1;
        output();
        return;
    }
    for (int i = 1; i <= 9; i++)
    {
        //关于这个字符'0'可以填那个数字,进行搜索
        if (check(i, x, y) && !flag)
        {
            map[x][y] = i;
            dfs(k + 1);
            map[x][y] = 0;
        }
    }
    return;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        input();
        flag = 0;
        //从第一个字符'0'开始处理
        dfs(0);
    }
    return 0;
}



题源:poj.org/problem?id=…