题意是求一个满足条件的矩阵,n可能取值为1,2,3。
n=1 如果b[1][1]=0随便输出一个数,而b[1][1]!=0显然无解
n=2 先枚举[1][1],[1][2],[2][1]判下[1][1],再枚举[2][2]判下其他三个位置是否满足
n=3 先枚举[1][2],[2][1],[2][3],[3][2],然后枚举四个角并判断,最后枚举[2][2]判断。
总的来说,没有什么难度,就是一个麻烦题。
PS:我居然把无解情况输出"NO",狂WA找不到错。。。
//SGU 125 Shtirlits
//search
//by night_watcher
#include<iostream>
#include<cstring>
using namespace std;
int a[5][5];
int b[4][4];
int n;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool judge(int k,int l){
int i,cnt=0;
for(i=0;i<4;i++){
if(a[k][l]<a[k+dx[i]][l+dy[i]]){
cnt++;
}
}
return cnt==b[k][l];
}
int main(){
int i,j,k,l,c,d,e,f,g;
bool flag;
while(cin>>n){
memset(a,0,sizeof(a));
flag=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>b[i][j];
switch(n){
case 1:{
if(b[1][1]!=0) cout<<"NO SOLUTION"<<endl;
else cout<<0<<endl;
break;
}
case 2:{
for(i=0;i<=9&&!flag;i++)
for(j=0;j<=9&&!flag;j++)
for(k=0;k<=9&&!flag;k++){
a[1][1]=i;
a[1][2]=j;
a[2][1]=k;
if(!judge(1,1)) continue;
for(l=0;l<=9&&!flag;l++){
a[2][2]=l;
if(judge(1,2)&&judge(2,1)&&judge(2,2)) flag=1;
}
}
if(!flag) cout<<"NO SOLUTION"<<endl;
else{
for(i=1;i<3;i++)
cout<<a[i][1]<<" "<<a[i][2]<<endl;
}
break;
}
case 3:{
for(i=0;i<=9&&!flag;i++)
for(j=0;j<=9&&!flag;j++)
for(k=0;k<=9&&!flag;k++)
for(l=0;l<=9&&!flag;l++){
a[1][2]=i,a[2][1]=j,a[2][3]=k,a[3][2]=l;
for(c=0;c<=9&&!flag;c++){
a[1][1]=c;
if(!judge(1,1)) continue;
for(d=0;d<=9&&!flag;d++){
a[1][3]=d;
if(!judge(1,3)) continue;
for(e=0;e<=9&&!flag;e++){
a[3][1]=e;
if(!judge(3,1)) continue;
for(f=0;f<=9&&!flag;f++){
a[3][3]=f;
if(!judge(3,3)) continue;
for(g=0;g<=9&&!flag;g++){
a[2][2]=g;
if(judge(2,2)&&judge(1,2)&&judge(2,1)&&judge(2,3)&&judge(3,2)) flag=1;
}
}
}
}
}
}
if(flag)
for(i=1;i<4;i++){
cout<<a[i][1]<<" "<<a[i][2]<<" "<<a[i][3]<<endl;
}
else cout<<"NO SOLUTION"<<endl;
break;
}
}
}
return 0;
}