hdu 5547

***题意:4*4数独,要求在同一行同一列不能有相同的数字,另外在2*2的小单元里也不能有相同的数字

思路:DFS暴力搜索, 每个位置填1—4,递归回溯,判断是否符合条件,递归到最后一个位置+1则输出答案***

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<queue>
#include<vector>
#include<algorithm>

using namespace std;
typedef long long LL;
#define N 1001000
#define INF 0x3f3f3f

char maps[10][10];

int judge(int row, int col)
{
    for(int i=0; i<4; i++)
    {
        if(maps[row][i]==maps[row][col]&&i!=col)
            return 0;
    }
    for(int i=0; i<4; i++)
    {
        if(maps[i][col]==maps[row][col]&&i!=row)
            return 0;
    }

    int Row, Col;
    if(row%2==1) Row=row-1;
    else Row=row;

    if(col%2==1) Col=col-1;
    else Col=col;

    for(int i=Row; i<=Row+1; i++)
    {
        for(int j=Col; j<=Col+1; j++)
        {
            if(maps[i][j]==maps[row][col]&&i!=row&&j!=col)
                return 0;
        }
    }
    return 1;
}

void DFS(int t)
{
    if(t==16)
    {
        for(int i=0; i<4; i++)
            puts(maps[i]);
        return ;
    }

    int row=t/4;//行列转换方法,知道如何转换,就可以运用递归去求解了
    int col=t%4;

    if(maps[row][col]=='*')
    {
        for(int i=1; i<=4; i++)
        {
            maps[row][col]=i+'0';
            if(judge(row, col))
                DFS(t+1);

            maps[row][col]='*';
        }
    }
    else
        DFS(t+1);
}

int main()
{
    int T, cas=1;
    scanf("%d", &T);

    while(T--)
    {
        for(int i=0; i<4; i++)
            scanf("%s", maps[i]);

        printf("Case #%d:
", cas++);

        DFS(0);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/9968jie/p/5734322.html