SGU 125 Shtirlits(搜索)

本文提供了一道名为SGU125Shtirlits的编程题目解决方案,通过穷举法寻找符合条件的矩阵。针对不同大小的矩阵(n=1,2,3),采取不同的策略确保满足题目条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意是求一个满足条件的矩阵,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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值