原题链接:蓝桥杯2018年第九届真题-整理玩具
解题思路:
注意到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分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复