每日刷题(八十一)
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;
}
样例结果运行如下: