解题思路:
注意到n,m,t较小,考虑暴力解法。

相等的数字在一起并且是矩形要求:1.每一行相等的数字是连续段,2.对于任意一个数字,它在每一行连续段的出现起点与出现终点一致。

利用数组minn[i][j]记录数字j在第i行的起始位置,mxxx[i][j]记录数字j在第i行的终点位置,sum[i][j]记录数字j在第i行的出现次数。

对于条件1,要求mxxx[i][j]-minn[i][j]+1==sum[i][j],因为对于一行,所有可能的数字j的位置均在minn[i][j]与mxxx[i][j]间,等式左边计算的是这包括起点终点的长度,只有长度就是数字出现次数时,才能这段长度里全是这个数字,即数字连续。

对于条件2,在条件1的基础上要求mxxx[i][j]==mxxx[x][j](mxxx[x][j]!=0) 和minn[i][j]==minn[x][j](mxxx[x][j]!=INF) 

复杂度O(T*m*n)
注意事项:
注意细节,数组初始化等。
参考代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx 13
int v,e,k,a,b,n,m,t,x,y,l,r,neww,neww2,w,ans=0,q,noww,ans1,ans2;
int sum[maxx][maxx];
int minn[maxx][maxx];
int mxxx[maxx][maxx];
int smax[maxx];
int smin[maxx];
int all[maxx][maxx];
string s;


int main()
{
  cin>>t;
  for(int i=1;i<=t;++i)
 {cin>>n>>m;
 for(int i=1;i<=n;++i)
    {cin>>s;
    for(int j=1;j<=m;++j)
    all[i][j]=s[j-1]-'0';
    }
    ans=0;
   for(int i=1;i<=n;++i)
    for(int j=0;j<=9;++j)
     {sum[i][j]=0;
     minn[i][j]=INF;
     mxxx[i][j]=0;
     }
 for(int j=0;j<=9;++j)
  {smax[j]=0;
  smin[j]=INF;}

  for(int i=1;i<=n;++i)
     for(int j=1;j<=m;++j)
      {++sum[i][all[i][j]];
      minn[i][all[i][j]]=min(minn[i][all[i][j]],j);
      mxxx[i][all[i][j]]=max(mxxx[i][all[i][j]],j);
      }
 
    for(int i=1;i<=n;++i)
    for(int j=0;j<=9;++j)
     {if(minn[i][j]==INF&&mxxx[i][j]==0) continue;
      if(mxxx[i][j]-minn[i][j]+1!=sum[i][j]) ans=1;
      if(smax[j]==0) smax[j]=mxxx[i][j];
      if(smin[j]==INF) smin[j]=minn[i][j];
     }

      for(int i=1;i<=n;++i)
    for(int j=0;j<=9;++j)
     {if(minn[i][j]==INF&&mxxx[i][j]==0) continue;
      if(smax[j]!=mxxx[i][j]) ans=1;
      if(smin[j]!=minn[i][j]) ans=1;
     }
       
     
   
  if(ans==0) cout<<"YES\n";
  else cout<<"NO\n";
 }
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论