1.单元格
Cat Taro有一个N行和N列的正方形网格。网格的每个单元格都涂成黑色或白色。
Taro想要选择一段连续的单元格,这段单元格必须位于同一列中并且有相同的颜色。
求他可以选择的最大数量的单元格。
输入格式
第一行,一个整数N。1 <= N <= 50。
接下来是N行N列的网格。每个各自要么是白色 'W', 要么是黑色 'B’。
输出格式
一个整数,表示最多数量的单元格。
输入/输出例子1
输入:
4
BWBW
BBWB
WWWB
BWWW
输出:
3
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,maxx;
char a[105][105];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin>>a[i][j];
}
for(int j=1;j<=n;j++)
{
int cot=0;
for(int i=1;i<=n;i++)
{
if(a[i][j]=='B')cot++;
else maxx=max(maxx,cot),cot=0;
}
maxx=max(maxx,cot);
}
for(int j=1;j<=n;j++)
{
int cot=0;
for(int i=1;i<=n;i++)
{
if(a[i][j]=='W')cot++;
else maxx=max(maxx,cot),cot=0;
}
maxx=max(maxx,cot);
}
cout<<maxx;
return 0;
}
2.01矩阵反转
陈老师最近在研究一个手机游戏,要求是:有一个0、1组成的矩形,每次可以选一点,比如R行C列的,用(R,C)表示,这时包括(R,C)在内的所有左上角区域中的数字将反转,即0变成1,1变成0。
陈老师想让你编程计算出最少要选几次,就可以把矩形中所有数字变为0。
注:给出的矩阵保证有解。
输入格式
文件第一行有两个整数N、M (1≦N,M≦50),表示矩阵的行和列大小。下面有N行,每行是一个长度为M的01串。
输出格式
仅一个数,要把矩形中所有数字变为0最少的选择次数。
输入/输出例子1
输入:
2 4
0000
0000
输出:
0
输入/输出例子2
输入:
2 2
01
01
输出:
2
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[60][60];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=n;i>=1;i--)
{
for(int j=m;j>=1;j--)
{
if(a[i][j]=='1')
{
ans++;
for(int ii=1;ii<=i;ii++)
for(int jj=1;jj<=j;jj++)
if(a[ii][jj]=='1')a[ii][jj]='0';
else a[ii][jj]='1';
}
}
}
cout<<ans;
return 0;
}
3.矩阵的转置
矩阵的转置:输入n*m的矩阵,将其转置后输出,矩阵转置是矩阵的行列交换,如:
A: B:
1 2 3 转置为 1 4 7 10
4 5 6 2 5 8 11
7 8 9 3 6 9 12
10 11 12
输入格式
第一行两个整数n、m(n,m<=100),表示矩阵的行数和列数;
接下来共n行,每行m个整数。
输出格式
m行,每行n个数,表示转置后的矩阵。
输入/输出例子1
输入:
4 3
1 2 3
4 5 6
7 8 9
10 11 12
输出:
1 4 7 10
2 5 8 11
3 6 9 12
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105][105];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int j=0;j<m;j++)
{
for(int i=0;i<n;i++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
4.填单词
现在有一个N*N(5<=N<=100)的方格,其中格子中为‘-’的表示空格,为‘#’表示不可填格子。比如
----#
--##-
-----
-##--
#----
一个单词长度至少是2,并按通常的纵横字谜规则填。上图中,我们可以填写5个横向的单词,可以填写4个纵向的单词。
你的任务是对于给定的方格,求可以有多少个横向和纵向的单词。
输入格式
第一行: 一个整数 N。
第二至第N+1行: 第行有 N 个字母,或者是'#' 或者是 '-'. 表示方格的初始状态.
输出格式
只一行: 有两个用空格分开的整数,分别为横向的单词数和纵向的单词数.
输入/输出例子1
输入:
5
----#
--##-
-----
-##--
#----
输出:
5 4
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,ans1,ans2,cot=1;
char a[105][105];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
{
cot=0;
for(int j=1;j<=n;j++)
{
if(a[i][j]=='-')cot++;
else
{
if(cot>=2)ans1++;
cot=0;
}
}
if(cot>=2)ans1++;
}
for(int j=1;j<=n;j++)
{
cot=0;
for(int i=1;i<=n;i++)
{
if(a[i][j]=='-')cot++;
else
{
if(cot>=2)ans2++;
cot=0;
}
}
if(cot>=2)ans2++;
}
cout<<ans1<<" "<<ans2;
return 0;
}
5.监考老师
在一个大试场里,有n行m列的考生,小王和众多同学正在考试,这时,有一部分考生作弊,当然,监考老师能发现他们。但是只有一个监考老师,他由于高度近视,只能发现与他同行同列的作弊者,而且由于监考老师年老体弱,在考试过程中无法移动。现在已知n*m个考生中谁在作弊,请帮监考老师找一个位置,可以发现最多的作弊者(监考老师可以和某个考生在同一位置)。如果监考老师的位置上的考生在作弊,那么监考老师先前后看,发现他作弊,再左右看,又发现他作弊,算做发现2个考生作弊。
输入格式
第一行两个数n,m ,表示试场是n*m的,接下来是n*m的矩阵,1表示作弊,0表示不作弊。
输出格式
共一行,一个数,表示最多可以发现多少作弊者。
输入/输出例子1
输入:
5 5
0 0 1 0 0
0 0 1 0 0
1 1 1 1 1
0 0 1 0 0
0 0 1 0 0
输出:
10
样例解释
监考老师在最中间,那个位置上的作弊者算作2次
【数据范围】
对于50 %的数据,n,m大于0小于等于10,对于100 %的数据,n,m大于0小于等于2000。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[2005][2005],ans,hang[2005],lie[2005];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++){
if(a[i][j]==1)hang[i]++;
}
}
for(int j=0;j<m;j++)
{
for(int i=0;i<n;i++){
if(a[i][j]==1)lie[j]++;
}
}
sort(hang,hang+n);
sort(lie,lie+m);
cout<<hang[n-1]+lie[m-1];
return 0;
}
XXS代码,大神不喜勿喷。