2 条题解

  • 0
    @ 2025-10-8 16:48:26
    #include<bits/stdc++.h>
    using namespace std;
    int a[15][15],b[15][15],ans,n,m,R[15],C[15];
    bool Rmk[15][10],Cmk[15][10];
    bool ok()
    {
        for(int i=1;i<=n;i++)if(R[i]!=0)return 0;
        for(int j=1;j<=m;j++)if(C[j]!=0)return 0;
        return 1;
    }
     
    void dfs(int x,int y)
    {
        if(ans>1)return;
    	
    	if(x==n+1)
        {
            if(ok()==1){ans++;memcpy(b,a,sizeof(b));}
            return;
        }
        if(y==m+1)
        {
            if(R[x]==0)dfs(x+1,1);
            return;
        }
        if(a[x][y]!=0){dfs(x,y+1);return;}
         
        
        for(int k=1;k<=9;k++)
        {
            if(Rmk[x][k]==0&&Cmk[y][k]==0&&R[x]>=k&&C[y]>=k)
            {
                a[x][y]=k;
                Rmk[x][k]=Cmk[y][k]=1;
                R[x]-=k;
                C[y]-=k;
                 
                dfs(x,y+1);
                 
                a[x][y]=0;
                Rmk[x][k]=Cmk[y][k]=0;
                R[x]+=k;
                C[y]+=k;
            }
        }   
    }
    int main()
    {
        int t;scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)scanf("%d",&R[i]);
            for(int j=1;j<=m;j++)scanf("%d",&C[j]);
            for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
            memset(Rmk,0,sizeof(Rmk));
            memset(Cmk,0,sizeof(Cmk));
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(a[i][j]!=0)
                    {
                        R[i]-=a[i][j];
                        C[j]-=a[i][j];
                        Rmk[i][a[i][j]]=1;
                        Cmk[j][a[i][j]]=1;
                    }
                }
            }
            ans=0;
            dfs(1,1);
            if(ans>1)printf("Not unique.\n");
            else if(ans==0)printf("No answer.\n");
            else
            {
                for(int i=1;i<=n;i++)
                {
                    for(int j=1;j<=m;j++)
                    {
                        printf("%d ",b[i][j]);
                    }
                    printf("\n");
                }
            }
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:48:16
      #include<bits/stdc++.h>
      using namespace std;
      int a[15][15],b[15][15],ans,n,m,R[15],C[15];
      bool Rmk[15][10],Cmk[15][10];
      bool ok()
      {
          for(int i=1;i<=n;i++)if(R[i]!=0)return 0;
          for(int j=1;j<=m;j++)if(C[j]!=0)return 0;
          return 1;
      }
       
      void dfs(int x,int y)
      {
          if(ans>1)return;
      	
      	if(x==n+1)
          {
              if(ok()==1){ans++;memcpy(b,a,sizeof(b));}
              return;
          }
          if(y==m+1)
          {
              if(R[x]==0)dfs(x+1,1);
              return;
          }
          if(a[x][y]!=0){dfs(x,y+1);return;}
           
           
          for(int k=1;k<=9;k++)
          {
              if(Rmk[x][k]==0&&Cmk[y][k]==0&&R[x]>=k&&C[y]>=k)
              {
                  a[x][y]=k;
                  Rmk[x][k]=Cmk[y][k]=1;
                  R[x]-=k;
                  C[y]-=k;
                   
                  dfs(x,y+1);
                   
                  a[x][y]=0;
                  Rmk[x][k]=Cmk[y][k]=0;
                  R[x]+=k;
                  C[y]+=k;
              }
          }   
      }
      int main()
      {
          int t;scanf("%d",&t);
          while(t--)
          {
              scanf("%d%d",&n,&m);
              for(int i=1;i<=n;i++)scanf("%d",&R[i]);
              for(int j=1;j<=m;j++)scanf("%d",&C[j]);
              for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
              memset(Rmk,0,sizeof(Rmk));
              memset(Cmk,0,sizeof(Cmk));
              for(int i=1;i<=n;i++)
              {
                  for(int j=1;j<=m;j++)
                  {
                      if(a[i][j]!=0)
                      {
                          R[i]-=a[i][j];
                          C[j]-=a[i][j];
                          Rmk[i][a[i][j]]=1;
                          Cmk[j][a[i][j]]=1;
                      }
                  }
              }
              ans=0;
              dfs(1,1);
              if(ans>1)printf("Not unique.\n");
              else if(ans==0)printf("No answer.\n");
              else
              {
                  for(int i=1;i<=n;i++)
                  {
                      for(int j=1;j<=m;j++)
                      {
                          printf("%d ",b[i][j]);
                      }
                      printf("\n");
                  }
              }
          }
          return 0;
      }
      • 1

      信息

      ID
      85
      时间
      5000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      198
      已通过
      59
      上传者