37、《信息学奥赛一本通 编程启蒙 C++版》 3361-3370(10题)

1、3361:【例62.3】 地雷数计算

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
 
int dx[9] = {0, -1, 1, 0, 0, -1, -1, 1, 1};
int dy[9] = {0, 0, 0, -1, 1, -1, 1, -1, 1};
char a[105][105];
 
int main()
{
	int n, m;
	scanf("%d%d", &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] == '*')
				printf("*");
				
			if(a[i][j] == '?')
			{
				int ans = 0;
				
				for(int k = 1; k <= 8; k++)
				{
					if(a[i + dx[k]][j + dy[k]] == '*')
						ans++;
				}
				
				printf("%d", ans);
			}
		}
		
		printf("\n");
	}
	
	return 0;
}



2、3362:练62.1 矩形的下三角

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int a[105][105],n;
	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<=i;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}



3、3363:练62.2 矩阵乘法

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

练 62.2 矩阵乘法

1125:矩阵乘法

信息学奥赛一本通(C++版)在线评测系统

/*
1.8编程基础之多维数组_09矩阵乘法
http://noi.openjudge.cn/ch0108/09/
*/
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int a[101][101],b[101][101],c[101][101];
int main()
{
	int n,m,k;
	
	cin>>n>>m>>k;
	
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>a[i][j];
			
	for(int i=0;i<m;i++)
		for(int j=0;j<k;j++)
			cin>>b[i][j];
	
	for(int i=0;i<n;i++)
		for(int j=0;j<k;j++)
			for(int k=0;k<m;k++)
				c[i][j]=c[i][j]+a[i][k]*b[k][j];
	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<k;j++)
			cout<<c[i][j]<<" ";
				cout<<endl;
	}
	
	return 0;
}



4、3364:练62.3 学习效率

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

#include <bits/stdc++.h>
using namespace std;
int n,a[15][15],b;
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++){
		for(int j=1;j<=n;j++){
			b=0;
			b=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1];
			b+=a[i][j-1]+a[i][j]+a[i][j+1];
			b+=a[i+1][j-1]+a[i+1][j]+a[i+1][j+1];
			cout<<b<<" ";
		}
		cout<<endl;
	}
}



5、3365:【例63.1】 蛇形填数

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

[例 63.1] 蛇行填数

2045:【例5.13】蛇形填数

信息学奥赛一本通(C++版)在线评测系统

/*

NOIP1995 普及组复赛第2题 方阵填数
https://blog.csdn.net/WDAJSNHC/article/details/79381876


例5.13  蛇形填数
     在n*n方阵里填入1,2,3,…,n*n,要求填成蛇形。例如n=4时方阵为:
     10  11   12  1
     9   16   13  2
     8   15   14  3
     7    6   5   4
    上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出,n<=8。
【分析】:
    类比数学中的矩阵,我们可以用一个所谓的二维数组来储存题目中的方阵。
    只需声明一个int a[MAXN][MAXN],就可以获得一个大小为MAXN×MAXN的方阵。
	在声明时,两维的大小不必相同,因此也可以声明int a[30][50]这样的数组,
	第一维下标范围是0,1,2,…,29,第二维下标范围是0,1,2,…,49。
    让我们从1开始依次填写。设“笔”的坐标为(x,y),则一开始x=0,y=n-1,
	即第0行,第n-1列(别忘了行列的范围是0到n-1,没有第n列)。
	“笔”的移动轨迹是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,
	上。总之,先是下,到不能填了为止,然后是左,接着是上,最后是右。
	“不能填”是指再走就出界(例如4→5),
	或者再走就要走到以前填过的格子(例如12→13)。
	如果我们把所有格子初始为0,就能很方便地加以判断。
*/
#include <cstdio>
#include <cstring>
#define MAXN 30
int a[MAXN][MAXN];
int main()
{
	int n,x,y,tot=0;
	
	scanf("%d",&n);
	
	memset(a,0,sizeof(a));
	
	tot=a[x=0][y=n-1]=1;  //起始的位置从1开始 
	
	//a[x=0][y=n-1]=1;
	//x=0;y=n-1; a[x][y]=1;
	//tot=1;
	
	while (tot<n*n)
    {
        while (x+1<n  &&  !a[x+1][y])   a[++x][y]=++tot;
        while (y-1>=0 &&  !a[x][y-1])   a[x][--y]=++tot;
        while (x-1>=0 &&  !a[x-1][y])   a[--x][y]=++tot;
        while (y+1<n  &&  !a[x][y+1])   a[x][++y]=++tot;
    }
    
	for(x=0;x<n;++x)
    {
		for (y=0;y<n;++y) 
		{
			printf("%d ",a[x][y]);
		}
		
		printf("\n");
    }
    
	return 0;	
}
/*
【说明】:
    这段程序充分利用了C++语言简洁的优势。
	首先,赋值x=0和y=n-1后马上要把它们作为a数组的下标,
	因此可以合并完成;tot和a[0][n-1]都要赋值1,也可以合并完成。
	这样,我们用一条语句完成了多件事情,而且并没有牺牲程序的可读性,
	这段代码的含义显而易见。
    那4条while语句有些难懂,不过十分相似,因此只需介绍其中的第一条:不断向下走,
	并且填数。
	我们的原则是:先判断,再移动,而不是走一步以后发现越界了再退回来。
	这样,我们需要进行“预判”,即是否越界,
	以及如果继续往下走会不会到达一个已经填过的格子。
	越界只需判断x+1<n,因为y值并没有修改;下一个格子是(x+1,y),因此只需a[x+1][y]==0,简写成!a[x+1][y](其中!是“逻辑非”运算符)。
    细心的读者也许会发现这里的一个“潜在bug”;如果越界,x+1会等于n,a[x+1][y]将访问非法内存!幸运的是,这样的担心是不必要的。&&是短路运算符。如果x+1<n为假,将不会计算!a[x+1][y],也就不会越界了。
    至于为什么是++tot而不是tot++,留给读者思考。
*/



6、3366:【例63.2】 回形方阵

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

#include<bits/stdc++.h>
 
using namespace std;
int a[100][100],n,k=0;
int main(){
 
    cin>>n;
 
    for(int i=n;i>=0;i--){
        for(int h=1;h<=2*n+1;h++){
            for(int l=1;l<=2*n+1;l++) {
                if ((h==1+k||h==2*n+1-k||l==1+k||l==2*n+1-k) && a[h][l]==0) {
                    a[h][l] = i;
                }
            }
        }
        k++;
    }
    for(int i=1;i<=2*n+1;i++){
        for(int j=1;j<=2*n+1;j++) {
            printf("%2d",a[i][j]);
        }
        cout<<"\n";
    }
}



7、3367:练63.1 蛇行三角形

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3367:练63.1 蛇行三角形(编程启蒙)
http://bas.ssoier.cn:8086/problem_show.php?pid=3367
https://blog.csdn.net/qq_65448545/article/details/134677841
*/
#include <iostream>
using namespace std;
int a[105][105],h,k=1,l,hy=0;
int main(){
    int n;
    cin >> n;
    hy = n-1;
    for(int i = 1;i<=n;i++) {
        h = n-hy;
        l = 1;
        for (; h != 0;) {
            a[h][l] = k++;
            h--;
            l++;
        }
        hy--;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (a[i][j] == 0){
                continue;
            }else {
                printf("%d ", a[i][j]);
            }
        }
        cout << "\n";
    }
}



8、3368:练63.2 斜行方阵

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

#include <iostream>
using namespace std;
int a[105][105],h,k=1,l;
int main(){
    int n;
    cin >> n;
    for(int i=n;i>=1;i--){
        h=1;
        l=i;
        while(l<=n){
            a[h++][l++]=k++;
        }
    }
    for(int i=1;i<=n-1;i++){
        h=i+1;
        l=1;
        while(h<=n){
            a[h++][l++]=k++;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%4d",a[i][j]);
        }
        cout<<"\n";
    }
}



9、3369:练63.3 迂回方阵

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3369:练63.3 迂回方阵(编程启蒙)
http://bas.ssoier.cn:8086/problem_show.php?pid=3369
*/
#include <iostream>
using namespace std;
int a[105][105],h,k=1,l,b=2,hy=0;
int main(){
    int n;
    cin >> n;
    h=n-1;
    for (int i = 0; i <= n-1; i++) {
        h = n - hy;
        l = 1;
        for (; l != b;) {
            a[h][l] = k++;
            l++;
        }
        l--;
        for (; h != n;) {
            h++;
            a[h][l] = k++;
        }
        b++;
        hy++;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%4d", a[i][j]);
        }
        cout << "\n";
    }
}



10、3370:【例64.1】 二维数组转置

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3370:【例64.1】 二维数组转置
http://bas.ssoier.cn:8086/problem_show.php?pid=3370

1.8编程基础之多维数组_10矩阵转置
http://noi.openjudge.cn/ch0108/10/
*/
#include<iostream>
using namespace std;
int a[105][105];
int main( void )
{
	int n,m;
	
	cin>>n>>m;
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
			
	cout<<m<<" "<<n<<endl;
	for(int j=1;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
			cout<<a[i][j]<<" ";
			cout<<endl;
	}
	
	return 0;
}



二维数组-蛇形方阵、神奇的幻方

二维数组-蛇形方阵、神奇的幻方-CSDN博客

电子学会 C语言 2级 45 、蛇形填充数组

电子学会 C语言 2级 45 、蛇形填充数组-CSDN博客

C++基础 二维数组之蛇形矩阵、蛇形填数、神奇的幻方等

C++基础 二维数组之蛇形矩阵、蛇形填数、神奇的幻方等-CSDN博客






 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值