如果可以,可以陪你千年不老,千年只想眷顾你倾城一笑;如果愿意,愿意陪你永世不离,永世只愿留恋你青丝白衣。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int s[10],jg[10],vis[10],ct;
//一维数组存储3*3矩阵
bool jc()
{
int sum=0;
for(int i=0; i<3; i++)
{
sum=0;
for(int j=0; j<3; j++)//第i行的和
sum+=s[i*3+j];
if(sum!=15)
return false;
sum=0;
for(int j=0; j<3; j++)//第i列的和
sum+=s[j*3+i];
if(sum!=15)
return false;
}
if(s[0]+s[4]+s[8]!=15||s[2]+s[4]+s[6]!=15)//对角线不满足
return false;
return true;
}
void dfs(int tt)
{
if(ct>1)//次数大于一,剪枝直接退出
return;
if(tt==9)//找到九个数
{
if(jc())//满足九宫格特性
{
ct++;
//将得到矩阵装入结果矩阵
memcpy(jg, s, sizeof(s));
}
return;
}
if(s[tt])//已经给出的数
dfs(tt+1);
else
{
for(int i=1; i<=9; i++)
{
if(!vis[i])//枚举找没出现的数
{
vis[i]=1;//标记当前数
s[tt]=i;//暂时存上
dfs(tt+1);//找下一个
s[tt]=0;//可能不满足要回溯
vis[i]=0;
}
}
}
}
int main()
{
for(int i=0; i<9; i++)
{
cin>>s[i];
vis[s[i]]=1;
}
dfs(0);
if(ct==1)//如果只有一组可行解,输出
{
for(int i=-0; i<3; i++)
{
for(int j=0; j<3; j++)
cout<<jg[i*3+j]<<' ';
cout<<endl;
}
}
else
cout<<"Too Many"<<endl;
return 0;
}
来源:CSDN
作者:0k-ok
链接:https://blog.csdn.net/weixin_44170305/article/details/103465774