作业介绍

本次主要对二维数组和题目进行了练习,练习题目以及答案如下,如果完成可以在:

P186 【入门】数字走向III

  • 分析:每次先走列,后走行,使用计数器cnt,每次+1.
  • 使用setw(m) 控制宽度,需要头文件 iomanip,此类输出一般无需再使用空格。
#include<iostream>
#include<iomanip>
using namespace std;
const int N=100;
int n,m, cnt=0;
int a[N][N];

int main(){
    cin>>n;
    for(int j=1; j<=n; j++)
        for(int i=1; i<=n; i++)
            a[i][j] = ++cnt;

    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cout<<setw(3)<<a[i][j];
        }
        cout<<endl;
    }
    return 0;
}

P270 【入门】郭远摘苹果

  • 分析:题目其实只是求最大值与最小值的差,可以不使用二维数组,直接输入 nmn*m 个元素即可;
  • 求最大值maxx的时候需要保证其至少被更新一次,所以初始化为极小值,此题为 0
  • 求最小值 minx的时候同理,初始化为极大值10910^9
#include<iostream>
using namespace std;

int main(){
    int n,m,x, maxx=0, minx=1e9;
    cin>>n>>m;
    for(int i=1; i<=n*m; i++){
        cin>>x;
        if(maxx < x) maxx = x;
        if(minx > x) minx = x;
    }
    cout<<maxx - minx;
    return 0;
}

P272 【入门】求各个科目成绩的平均分

  • 分析:求科目分数均值,那么使用 x[i] 记录当前输入的学科 i 的分数,s[i] 记录学科 i 的总分数,需要注意使用double
#include <iostream>
#include <iomanip>
using namespace std;
int n;
double x[4], s[4];
int main(){
    cin>>n;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=3; j++){
             cin>>x[j];
             s[j] += x[j];
        }
    }

    for(int i=1; i<=3; i++) 
        cout<<fixed<<setprecision(1)<<s[i]/n<<" ";
    return 0;
}

P381 【入门】靶心数

  • 分析:判断(i,j) 是否是一个山峰的时候,需要看四周数据,所以需要使用二维数组存储
  • 不考虑边缘数据,可以直接从[2,n-2]行, [2,m-1]列进行遍历,这样保证其一定有四个方向的元素。
  • int& t = a[i][j], 此次& 起到引用的作用,表示取别名,给 a[i][j] 取一个名字t,这样不会开辟空间,同时使得 ta[i][j] 二者的操作是等效的;当然,如果此处不使用 & 也是可以的。
  • 第三步:判断(i,j)四周的元素是否都比 t 小。
#include <iostream>
using namespace std;
const int N=110;
int n,m,a[N][N];

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=2; i<n; i++)
        for(int j=2; j<m; j++) {
            int& t = a[i][j];
            if(t>a[i-1][j] && t>a[i][j-1] && t>a[i+1][j] && t> a[i][j+1]){
                cout<<t<<endl;
            }
        }
    return 0;
}

P400 【入门】找回文数

  • 回文数是指:A=a1a2a3...an,B=anan1...a2a1,A=BA=a_1a_2a_3...a_n,B=a_na_{n-1}...a_2a_1,且A=B,那么称AA 是回文数。
  • while(t) b = b*10+t%10, t /= 10; 关键代码,可以带入数据 t=123,推导 b,t 的变化过程以帮助理解。
  • b=0,t=123
  • b=3, t=12
  • b=32, t=1
  • b=321, t=0
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,m,x;
int main() {
	cin>>n>>m;
    for(int i=1; i<=n*m; i++){
        int a,b=0; cin>>a;
        int t = a;
        while(t) b = b*10+t%10, t /= 10;
        if(a==b) cout<<a<<endl;
    }
	return 0;
}

P403 【入门】石头剪刀布

  • 分析:需要讨论9钟方案,比较麻烦,可以考虑什么状态下谁胜利
  • (a>b? "a win":"b win") 三目运算符号,此处用于对输出进行简写
  • 解释:(a>b? 语句1: 语句2)a>b 成立,就执行语句1;否则执行语句2.
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,m,a,b,x,y;
int main() {
    cin>>n;
    while(n--){
        cin>>x>>y;
        if(x==1&&y==2 || x==2&&y==3 || x==3&&y==1) a++;//A胜利的状态
        if(x==1&&y==3 || x==2&&y==1 || x==3&&y==2) b++;//B胜利的状态
    }
    if(a==b) cout<<"tie";
    else cout<<(a>b? "a win":"b win");
	return 0;
}
状态
已结束
题目
7
开始时间
2024-5-18 0:00
截止时间
2024-5-26 23:59
可延期
24 小时