The Problem
In this problem you are to generate a triangular wave form according to a specified pair of Amplitude and Frequency.
Input and Output
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.
Each input set will contain two integers, each on a separate line. The first integer is the Amplitude; the second integer is the Frequency.
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
For the output of your program, you will be printing wave forms each separated by a blank line. The total number of wave forms equals the Frequency, and the horizontal ``height'' of each wave equals the Amplitude. The Amplitude will never be greater than nine.
The waveform itself should be filled with integers on each line which indicate the ``height'' of that line.
NOTE: There is a blank line after each separate waveform, excluding the last one.
Sample Input
1
3
2
Sample Output
1
22
333
22
1
1
22
333
22
1
解題思考
這一題本身不難,不過我的上傳卻不斷地 Time limit exceeded。
我的方法是,分別建立每一行要印出的字串。由於波浪的每一行都是相同的個位數字,所以我可以直接利用 memset() 函式,快速建立每一行要印出的字串。
接著,我將每一行字串直接組成一個「波浪字串」之後,再根據頻率重複印出字串,就達到題目的要求了。
參考解答(C++)
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int n;
cin >> n;
bool first = true;
for (int i = 0; i < n; i++)
{
int a, f;
cin >> a >> f;
string wave;
char number[10];
// 畫出上波浪
for (int j = 1; j < a; j++)
{
memset(number, (j + '0'), j);
number[j] = '\0';
wave += number;
wave += '\n';
}
// 畫出下波浪
for (int j = a; j > 0; j--)
{
memset(number, (j + '0'), j);
number[j] = '\0';
wave += number;
wave += '\n';
}
for (int j = 0; j < f; j++)
{
// 判別是否該換行
if (first) { first = false; }
else { cout << endl; }
// 輸出波浪
cout << wave;
}
}
#ifndef ONLINE_JUDGE
system("pause");
#endif
return 0;
}
0 回覆:
張貼留言