回溯法解决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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!