题目链接:http://hihocoder.com/contest/hiho135/problem/1

由于是九宫格,全排列也就是9! (362880)种方式,我就直接暴力枚举排列好了。

 #include <bits/stdc++.h>

 using namespace std;

 int a[][];
int b[][];
bool vis[];
int num[];
int cnt; bool check() {
int num = b[][] + b[][] + b[][];
int num2 = ;
for(int i=;i<;i++)
num2 +=b[][i];
if(num2!=num) return false; num2 = ;
for(int i=;i<;i++)
num2+=b[][i];
if(num2!=num) return false; for(int i=;i<;i++)
{
num2 = ;
for(int j=;j<;j++)
{
num2 +=b[j][i];
}
if(num2!=num)
return false;
} num2 = ;
for(int i=;i<;i++)
num2 +=b[i][i];
if(num2!=num)
return false; num2 = ;
for(int i=;i<;i++)
num2 +=b[i][-i];
if(num2!=num)
return false; return true;
} int main()
{
cnt = ;
for(int i=;i<;i++)
for(int j=;j<;j++) {
scanf("%d",&a[i][j]);
if(a[i][j])
vis[a[i][j]] = true;
} for(int i=;i<=;i++)
if(!vis[i]) {
num[cnt++] = i;
} vector <int> ans[];
int ansnum = ; do {
int k = ;
for(int i=;i<;i++) {
for(int j=;j<;j++) {
if(a[i][j]==)
b[i][j]=num[k++];
else b[i][j] = a[i][j];
}
} if(check())
{
for(int i=;i<;i++)
for(int j=;j<;j++)
ans[ansnum].push_back(b[i][j]);
ansnum++;
} }while(next_permutation(num,num+cnt)); if(ansnum>)
puts("Too Many");
else if(ansnum==)
{
int k = ;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
printf("%d ",ans[][k++]);
}
puts("");
}
}
return ;
}
05-12 14:56