这个题一开始想用dfs但是不知道怎么剪枝,后来看了http://txhwind.diandian.com/?tag=sgu,在cur>n时调用dfs()函数判断,满足则dfs(cur+1),最后在cur>n*n时再check()。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define MAXN 9+9
using namespace std;
int num[MAXN],n,a[MAXN],flag=0;
int check(int cur)
{
int t=0;
if(cur-n>0&&num[cur-n]>num[cur])
t++;
if(cur+n<=n*n&&num[cur+n]>num[cur])
t++;
if(cur%n&&num[cur+1]>num[cur])
t++;
if(cur%n!=1&&num[cur-1]>num[cur])
t++;
if(flag==1&&cur==7) cout<<t<<endl;
if(t==a[cur])
return 1;
return 0;
}
void dfs(int cur)
{
if(cur>n*n)
{
int hg=0;
for(int i=1; i<=n*n; i++)
if(!check(i))
{
hg=1;
break;
}
if(!hg)
{
for(int i=1; i<=n*n; i++)
{
flag=1;
if(i%n==1) cout<<num[i];
else cout<<" "<<num[i];
if(i%n==0) cout<<endl;
}
exit(0);
}
}
for(int i=0; i<=9; i++)
{
num[cur]=i;
if(cur<=n||check(cur-n))
//if(check(cur))
dfs(cur+1);
}
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n;
memset(num,0,sizeof(num));
memset(a,0,sizeof(num));
for(int i=1; i<=n*n; i++)
cin>>a[i];
dfs(1);
cout<<"NO SOLUTION"<<endl;
return 0;
}