3月16号上午10点到11点半一共三道题
- 输入数n,求从1到n所有被3整除、被5整除和同时被两者整除的数并输出。
- 输入字符串,将字符串每一个字母变成其后边一个(abc变成bcd)并将变化后的a、e、i、o、u变成大写。
- 输入若干组字符串(包含0或1),求1能组成的最大正方形的边长。
例:1110、1110、1110、0000 输出3,110、110、001 输出2,100、000、000输出1.
前两个题极其简单,分分钟搞定,最后一个题编着编着就蒙了,本身不难,博主选择的是逻辑性较强的解法,加上紧张最后也没全做出来,只过了25%,考试结束理清思路分分钟解决(要哭了)。
以下是第三题解题思路及代码实现
取长或宽小的那一个做最大边长max,判断成不成立,不成立max–,再继续判断。
输入:3 //行数
110 //第一行
110 //第二行
000 //第三行
#include<iostream>
#include<algorithm>
#include<sstream>
#include<string>
#include<vector>
using namespace std;
int MaximalSquare(const vector<string>& strArr,const unsigned int size){
int n=strArr[0].size();
int max;
int l=0,r=0;
int i,j;
bool flag=true;
if(n>size)
max=size;
else
max=n;
while(max>1){
while((r+max)<=n){
while((l+max)<=size){
for(i=r;i<(max+r);i++){
for(j=l;j<(max+l);j++){
if(strArr[i][j]=='0'){
flag=false;
break;
}
}
if(strArr[i][j]=='0')
break;
}
l=l+max;
}
r=r+max;
}
if(flag)
return max;
max=max-1;
l=0;
r=0;
flag=true;
}
}
int main(){
int n;
cin>>n;
vector<string> strs;
for(int i=0;i<n;i++){
string s;
cin>>s;
strs.push_back(s);
}
cout<<MaximalSquare(strs,strs.size());
return 0;
}