回溯法解决Latin方格(每个数在每行每列只出现一次)

2024-01-01 16:33:22

填入每一个数都是一层递归

使用k来把每一个数的二维数组坐标求出来:

    int row=(k-1)/n;
    int col=(k-1)%n;

完整代码:?

#include<iostream>
using namespace std;
const int N=1010;
int A[N][N],t[N];
int n,cnt;
bool judge(int row,int col)
{
    int t=A[row][col];
    //检查同一行有没有和它相等的值
    for(int j=0;j<n;j++)
        if(j!=col&&A[row][j]==t)
            return false;
    //检查同一列有没有相等的值
    for(int i=0;i<n;i++)
        if(i!=row&&A[i][col]==t)
            return false;
    return true;
}
void solve(int k)
{
    //从第0行0列开始,k=cnt+1
    //cnt从0开始,k从1开始
//    int row=cnt/n;
//    int col=cnt%n;
    int row=(k-1)/n;
    int col=(k-1)%n;
    for(int j=1;j<=n;j++)
    {
        A[row][col]=j;
        if(judge(row,col))
        {
            if(k!=n*n)
            {
                solve(k+1);
            }
            else if(k==n*n)
            {
                if(A[0][0]==1&&A[0][1]==2&&A[0][2]==3)
                {
                    printf("--------找到一组解!-------\n");
                    for(int p=0;p<n;p++)
                    {
                        for(int q=0;q<n;q++)
                            printf("%d ",A[p][q]);
                        printf("\n");
                    }
                    cnt++;

                }
            }
        }
        A[row][col]=0;
    }
}
int main()
{
    cin>>n;

    solve(1);

    printf("共有%d组解\n",cnt);

    return 0;
}

运行结果(n=4,仅展示部分):

文章来源:https://blog.csdn.net/m0_72671017/article/details/135325667
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。