东方博宜题单题解(二维数组基础)附AC源码7-12题

T7 靶心数

问题描述

James 同学发现了在二维数组中有这样一类数,这个数正好比自己上下左右四个方向的数都大(由于需要比四个方向的数都大,因此这个数不可能在第一行、最后一行、第一列、最后一列), James 把它们称为靶心数。

请你编程求出一个二维数组的靶心数有哪些,输出他们。

输入

第一行是两个整数 n 和 m(n 和 m 都是 4∼100 之间的整数),代表接下来的二维数组有 n 行 m列。

接下来 n 行,每行有 m 个整数。

输出

请按照输入的顺序输出满足条件的靶心数,每行 1 个。

#include <bits/stdc++.h>
using namespace std;

int main(){
    int a[200][200];
    int i,j,n,m,t;
    
    cin >> n >> m;
    
    for(i = 0;i < n;i++){
        for(j = 0;j < m;j++){
            cin >> a[i][j];
        }
    }
    
    for(i = 1;i < n - 1;i++){
        for(j = 1;j < m - 1;j++){
            t = a[i][j];
            if(t > a[i - 1][j] && t > a[i + 1][j] && t > a[i][j - 1] && t > a[i][j + 1]){
                cout << t << endl;
            }
        }
    }
}

T8 奇偶统计

问题描述

在一个 n 行 m 列的二维数组中,有若干奇数和偶数,请编程统计出这个二维数组中,奇数和偶数分别有多少个?

输入

第一行是两个整数 n 和 m ( n 和 m 都是 4∼100 之间的整数),代表接下来的二维数组有 n 行 m 列。

接下来 n 行,每行有 m 个整数。(这些整数都是 0∼9999 之间的整数)

输出

两个整数用空格隔开,分别代表二维数组中奇数、偶数的个数。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int m,x,n,ou=0,ji=0;
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cin>>x;
			if(x%2==0) ou++;
			else ji++;
		}
	}
	cout<<ji<<" "<<ou;
	return 0;
}

T9 找回文数?

问题描述

James同学发现了在二维数组中有一些回文数,请编程找出这些回文数,并按照输入的顺序输出。

(回文数指的是这个数正过来读和反过来读是同一个数的数,比如 1、8、99、252、12211、8、99、252、1221 等)。

输入

第一行是两个整数 n 和 m (n 和 m 都是 4∼100 之间的整数),代表接下来的二维数组有 n 行 m 列。

接下来 n 行,每行有 m 个整数,这些整数都是 1∼9999 之间的整数。

输出

按照输入的顺序输出满足条件的回文数,每行 1 个。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m;
	string x,cnt;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>x;
			cnt=x;
			reverse(cnt.begin(),cnt.begin()+cnt.size());
			if(x==cnt) cout<<x<<endl;
		}
	}
	return 0;
}

T10 石头剪刀布?

问题描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。一天,小 a 和小 b 正好在玩石头剪刀布,假设 1 代表石头, 2 代表剪刀, 3 代表布。小 a 和小 b 一共玩了 n 轮,请问最后的比赛结果是小 a 赢了还是小 b 赢了,还是平局?

注意:最终输赢按照小 a和小 b 赢的总次数计算。例如:共比赛 7 局,小 a 赢了 4 局,小 b 赢了 3 局,那么输出“ a win ”。

输入

第一行,是一个整数 n (n≤100 )

接下来 n 行,每行有 2 个数,分别代表每轮比赛中小 a 和小 b 的出拳。

输出

如果小 a 赢了,输出字符串“ a win ”,如果小 b 赢了,输出字符串“ b win ”,如果平局则输出字符串“ tie ”。(请注意:输出的字符串全部是小写)

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,b,cnta=0,cntb=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a>>b;
		if((a==1&&b==2)||(a==2&&b==3)||(a==3&&b==1)) cnta++;
		else if(a!=b) cntb++;
	}
	if(cnta==cntb) cout<<"tie";
	else if(cnta>cntb) cout<<"a win";
	else cout<<"b win";
	return 0;
}

T11  扫雷(mine)

(格式有些问题,那就配个注释吧!)

问题描述

扫雷游戏是一款十分经典的单机小游戏。在 nn 行 mm 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出 nn 行 mm 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入

第一行是用一个空格隔开的两个整数 nn 和 mm,分别表示雷区的行数和列数。

接下来 nn 行,每行 mm 个字符,描述了雷区中的地雷分布情况。字符 \texttt{*}* 表示相应格子是地雷格,字符 \texttt{?}? 表示相应格子是非地雷格。相邻字符之间无分隔符。

输出

输出文件包含 nn 行,每行 mm 个字符,描述整个雷区。用 \texttt{*}* 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

#include<bits/stdc++.h>
using namespace std;
bool a[105][105];//一张地图,有雷为一,无雷为零 
int main()
{
    memset(a,0,sizeof(a));//地图最开始清空 
    int n,m;
    char tmp;
    cin>>n>>m; 
    for(int i=1;i<=n;i++)//读入地图 
    {
        for(int j=1;j<=m;j++) 
        {
            cin>>tmp;//读入每一个点 
            if(tmp=='*') a[i][j]=1;//如果是地雷就将这个点设为一 
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==1) printf("*"); //如果是地雷不用输出数字 
            else
            {
                printf("%d",a[i+1][j+1]+a[i+1][j-1]+a[i+1][j]+a[i][j+1]+a[i][j-1]+a[i-1][j+1]+a[i-1][j]+a[i-1][j-1]);
                //将旁边的雷加起来输出 
            }
        }
        printf("\n");
    }
    return 0;//愉快的结束了主程序 
}

T12  每个小组的最大年龄

问题描述

同学们在操场上排成了一个 n 行 m 列的队形,每行的同学属于一个小组,请问每个小组同学的最高年龄是几岁,请输出每个小组的最高年龄。 比如:如下是一个 3 行 4 列的队形,这个队形中每个数字代表了每个同学的年龄。

8 10 12 9
15 12 10 6
17 20 18 18

第一行的 4 个年龄中最高年龄是 12 岁。 第二行的 4 个年龄中最高年龄是 15 岁。 第三行的 4 个年龄中最高年龄是 20 岁。

输入

第 1 行有 2 个整数 n 和 m ,分别代表队形的行和列的值( 2≤n,m≤100 )

接下来 nn 行,每行有 mm 个整数,代表每个同学的年龄(每个同学的年龄的值在 1∼100之间)

输出

输出 n 行,每行有一个整数,代表每个小组年龄的最大值。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m,l=0;
    int a[1100][1100];
    cin>>n>>m;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]>=l){
                l=a[i][j];
            }
        }
        cout<<l<<endl;
        l=0;
    }
    return 0;
}

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值