竞码编程-蓝桥杯模拟赛6(大学生组&青少年组)TG画圆以及竞码编程P1052 - 形状输出

每日刷题(八十一)

P1052 - 形状输出

在这里插入图片描述
在这里插入图片描述
解析:

这题很简单,规律也很好找,但是这题有坑,在这里插入图片描述
如果没审好题直接做主观臆断每行中的各个数字之间间隔为一个空格那么就打错特错了,这里我们要用到setw()这个控制输出字符长度的函数

详细C++代码如下:

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int a[2 * n - 1][2 * n - 1] = {0};
	if(n == 1)
		cout << setw(3) << "1" << endl;
	else
	{
		a[n - 1][n - 1] = n;
		for(int i = 0; i < n - 1; i++)		//上排
		{
			int cnt = i + 1;
			for(int j = i; j < 2 * n - 1 - i; j++)
			{
				a[i][j] = cnt;
			}
		}
		
		for(int j = 0; j < n - 1; j++)		//左排 
		{
			int cnt = j + 1;
			for(int i = j + 1; i < 2 * n - 1 - j; i++)
			{
				a[i][j] = cnt;
			}
		} 
		
		for(int i = 2 * n - 2; i > n - 1; i--)		//下排 
		{
			int cnt = 2 * n - 1 - i;
			for(int j = 2 * n  - 1 - i; j < i + 1; j++)
				a[i][j] = cnt;
		}
		
		//右排
		for(int j = 2 * n - 2; j > n - 1; j--)
		{	
			int cnt = 2 * n - 1 - j;
			for(int i = 2 * n - 1 - j; i < j; i++)
				a[i][j] = cnt;
		} 
		
		for(int i = 0; i < 2 * n - 1; i++)
		{
			for(int j = 0; j < 2 * n - 1; j++)
			{
				cout << setw(3) << a[i][j];
			}	
			cout << '\n';
		} 
	}
} 

部分样例运行结果如下:
在这里插入图片描述
在这里插入图片描述

G、画圆

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
解析:

其实这题也不难做出来,主要在于审清题意

k是同心圆的数量,r是同心圆的半径

从样例的结果输出我们不难发现这个用数组更方便

思路:

1、圆心O(k * r + 1,k * r + 1)
2、每种奇数圆环对应的距离圆形的距离范围(这里我们可以考虑从cnt = k循环遍历,cnt–,从圆外到圆内进行数组的值分配
3、分三重循环进行数组值分配,分两个循环进行输出,偶数圆环输出2个空格,圆心为空也要输出两个空格,其他奇数圆环则输出数值然后再输出1个空格

我的C++代码如下:

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

bool dist(int x, int y, int xx, int yy, int r, int k)
{
	int lx = abs(x - xx) * abs(x - xx);
	int ly = abs(y - yy) * abs(y - yy);
	return lx + ly <= k * r * k * r; 
}

int main()
{
	int k, r;
	cin >> k >> r;
	int	m = 2 * k * r + 1;		//最外圆环的上边界最大范围 
	int n = 2 * k * r + 1;		//最外圆环的右边界最大范围 
	int a[m + 1][n + 1] = {0};	//从1开始遍历数组 
	int x = k * r + 1;
	int y = k * r + 1;			//圆心位置O(x, y) 
	
	
	int i, j;
	
	for(i = 1; i < m + 1; i++)
	{
		for(j = 1; j < n + 1; j++)
			a[i][j] = 0; 
	}
	
	for(int cnt = k; cnt >= 1; cnt--)
	{
		for(i = 1; i < m + 1; i++)
		{
			for(j = 1; j < n + 1; j++)
			{
				if(dist(i, j, x, y, r, cnt) == true)
					a[i][j] = cnt;
			}
		}
	}
	
	a[x][y] = -1;
	for(i = 1; i < m + 1; i++)
	{
		for(j = 1; j < n + 1; j++)
		{
			if(a[i][j] % 2 == 0)
				cout << "  ";
			else if(a[i][j] != 0 && a[i][j] != -1)
				cout << a[i][j] << " ";
			else if(a[i][j] == -1)
				cout << "  ";
		}	
		cout << endl;
	} 
	cout << endl;
	return 0;
}

样例结果运行如下:
在这里插入图片描述
在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值