洛谷P8924题解
洛谷 P8924 题解
题目描述
给你一个函数,画出它的函数图像(* 表示经过该点,. 表示不经过该点),大小为 \(n\times m\),其中 \(x\) 的范围是 \([0,n-1]\),\(f(x)\) 的范围是 \([0,m-1]\)。
题目分析
题目比较简单,我们看到数据范围,直接选择暴力枚举。
首先开一个二维字符数组 \(maps\) 记录数据。记得初始化为 .。(这里手动初始化,也可以选择使用 memset。)
for(int i = 0;i<500;i++)
{
for(int j = 0;j<500;j++)
{
maps[i][j] = '.';
}
}
然后处理输入,将输入的系数保存供后续使用。
for(int i = 0;i<=k;i++)
{
scanf("%lld",&nums[i]);
}
之后循环遍历 \(x\) 和 \(k\),计算每一个 \(x\) 对应的函数值。由于函数值可能很大,这里需要加一个特判,避免数组爆炸。
int sum;
for (int x = 0; x < n; x++)
{
sum = 0;
for (int i = 0; i <= k; i++)
{
sum += nums[i] * pow(x, i);
}
if (sum < m)
{
maps[x][sum] = '*';
}
}
最终我们可以愉快的输出,记得纵坐标是倒序的哦。
for (int i = n - 1; i >= 0; i--)
{
for (int j = 0; j < m; j++)
{
cout << maps[j][i];
}
cout << endl;
}
完整 AC 代码如下
#include <bits/stdc++.h>
using namespace std;
#define max_n 510
#define int long long
char maps[max_n][max_n];
int n, m, k;
int nums[max_n];
signed main()
{
scanf("%lld%lld%lld", &n, &m, &k);
for (int i = 0; i < 500; i++)
{
for (int j = 0; j < 500; j++)
{
maps[i][j] = '.';
}
}
for (int i = 0; i <= k; i++)
{
scanf("%lld", &nums[i]);
}
int sum;
for (int x = 0; x < n; x++)
{
sum = 0;
for (int i = 0; i <= k; i++)
{
sum += nums[i] * pow(x, i);
}
if (sum < m)
{
maps[x][sum] = '*';
}
}
for (int i = n - 1; i >= 0; i--)
{
for (int j = 0; j < m; j++)
{
cout << maps[j][i];
}
cout << endl;
}
return 0;
}
本文来自博客园,作者:cn_ryh,转载请注明原文链接:https://www.cnblogs.com/yuhang-ren/p/17070148.html

浙公网安备 33010602011771号