A 旗鼓相当的对手
题解:考察枚举,需要比较每两个人的第一次和第二次排名,若满足条件,则需要统计一次。
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a1,b1,c1,d1,a2,b2,c2,d2,cnt=0;
cin>>a1>>b1>>c1>>d1;
cin>>a2>>b2>>c2>>d2;
//第一场胜第二场负 或 第一场负第二场胜
//A与B比较
if(a1<b1&&a2>b2||a1>b1&&a2<b2){
cnt++;
}
//A与C比较
if(a1<c1&&a2>c2||a1>c1&&a2<c2){
cnt++;
}
//A与D比较
if(a1<d1&&a2>d2||a1>d1&&a2<d2){
cnt++;
}
//B与C比较
if(b1<c1&&b2>c2||b1>c1&&b2<c2){
cnt++;
}
//B与D比较
if(b1<d1&&b2>d2||b1>d1&&b2<d2){
cnt++;
}
//C与D比较
if(c1<d1&&c2>d2||c1>d1&&c2<d2){
cnt++;
}
cout<<cnt;
return 0;
}
B 图像变换
题解:考察循环嵌套,对于每一个行需要扩大k倍,对于每一个列需要扩大k倍,可以进行四重循环来进行输出。
参考代码:
#include<bits/stdc++.h>
using namespace std;
char c[101][101];
int main() {
int n,m,k;
cin>>n>>m>>k;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>c[i][j];
}
}
for(int i=1; i<=n; i++) {
for(int a=1; a<=k; a++) { //每行扩大k倍
for(int j=1; j<=m; j++) {
for(int b=1;b<=k;b++){ //每列扩大k倍
cout<<c[i][j];
}
}
cout<<endl;
}
}
return 0;
}
C 系动词
题解:考察字符串的使用,对于每个单词可以存储在字符串数组中,同时统计单词的个数,进行循环遍历每个单词。判断是am或者is、are的前一个单词是什么,紧接着输出与其匹配的单词。
参考代码:
#include<bits/stdc++.h>
using namespace std;
string s,t,word[101];
int cnt;
string pd(string pre){
if(pre=="i")return "am";
else if(pre=="you")return "are";
else if(pre!="i"||pre!="you") return "is";
}
int main(){
getline(cin,s);
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
t+=s[i];
}else{
word[++cnt]=t;
t="";
}
}
word[++cnt]=t;
for(int i=1;i<=cnt;i++){
if(word[i]=="am"||word[i]=="is"||word[i]=="are")
cout<<pd(word[i-1]);
else cout<<word[i];
cout<<' ';
}
return 0;
}
D 照明
题解:考察二维数组,对于是灯的位置进行上下左右进行延申判断,若是空地则进行标记,若遇到墙的位置则推出,最后将标记的位置个数进行统计,然后输出。
方法1:
#include<bits/stdc++.h>
using namespace std;
int n,ans;
char a[33][33];
bool vis[33][33];
void up(int x,int y){
for(int i=x-1;i>=1;i--)
if(a[i][y]=='.')vis[i][y]=1;
else break;
}
void down(int x,int y){
for(int i=x+1;i<=n;i++)
if(a[i][y]=='.')vis[i][y]=1;
else break;
}
void left(int x,int y){
for(int j=y-1;j>=1;j--)
if(a[x][j]=='.')vis[x][j]=1;
else break;
}
void right(int x,int y){
for(int j=y+1;j<=n;j++)
if(a[x][j]=='.')vis[x][j]=1;
else break;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]=='*') vis[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]=='*'){
up(i,j);
down(i,j);
left(i,j);
right(i,j);
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(vis[i][j])ans++;
cout<<ans;
return 0;
}
方法2:
#include <bits/stdc++.h>
using namespace std;
char a[35][35];
int main() {
int n,cnt=0;
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++){
for(int j=1;j<=n;j++){
if(a[i][j]=='*'){
//使用新的行、列变量,不能使用循环变量i,j
int ni=i,nj=j;
//上
while(ni-1>=1&&a[ni-1][j]!='#'){
ni--;
if(a[ni][j]=='.')
a[ni][j]='o';
}
//下
ni=i; //必须重新赋值,因为在上个循环里值已经改变
while(ni+1<=n&&a[ni+1][j]!='#'){
ni++;
if(a[ni][j]=='.')
a[ni][j]='o';
}
//左
while(nj-1>=1&&a[i][nj-1]!='#'){
nj--;
if(a[i][nj]=='.')
a[i][nj]='o';
}
//右
nj=j;
while(nj+1<=n&&a[i][nj+1]!='#'){
nj++;
if(a[i][nj]=='.')
a[i][nj]='o';
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]=='o'||a[i][j]=='*'){
cnt++;
}
}
}
cout<<cnt;
return 0;
}