模拟
模拟,顾名思义,就是题⽬让你做什么你就做什么,考察的是将思路转化成代码的代码能⼒
P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷
模拟+分类讨论,对于⼀元n次⽅程的的最终结果,我们仅需按照顺序,考虑每⼀项的三件事情:符号+系数+次数。
- 处理「符号」:
- 如果系数⼩于0 ,直接输出"-";
- 如果系数⼤于0 ,除了⾸项不输出"+",其余全部输出"+"
- 处理「系数」:
- 先取⼀个绝对值,因为正负的问题已经处理过了;
- 当系数不等于1 ,直接输出这个数;
- 但是当系数为1 ,且是最后⼀项的时候,这个1也是需要输出的;其余情况下的1不需要输出。
- 处理「次数」:
- 次数⼤于1 ,输出"x^"+对应的次数;
- 次数等于1 ,输出"x";
- 次数⼩于1 ,什么也不输出。
c++
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n; cin >> n;
for (int i = n; i >= 0; i--)
{
int a; cin >> a;
if (a == 0) continue;
if (a < 0) cout << '-';
else
{
if (i != n) cout << '+';
}
a = abs(a);
if (a != 1 || (a == 1 && i == 0)) cout << a;
if (i == 0) continue;
else if (i == 1) cout << 'x';
else cout << "x^" << i;
}
return 0;
}
P5731 【深基5.习6】蛇形方阵 - 洛谷

模拟填数的过程。
在⼀个矩阵中按照⼀定规律填数的通⽤解法:
- 定义⽅向向量,⽐如本题⼀共四个⽅向,分别是右、下、左、上,对应:(0, 1)、(1, 0)、(0, -1)、(-1, 0)
- 循环填数的规则:
- 朝⼀个⽅向⾛,⼀边⾛⼀边填数,直到越界;
- 越界之后,结合定义的⽅向向量,求出下⼀轮应该⾛的⽅向以及应该到达的正确位置;
- 重复上述过程,直到把所有的数填完为⽌。
c++
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
// 定义右下左上四个方向
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int arr[N][N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n; cin >> n;
//模拟填数过程
int x = 1, y = 1;//初始位置
int cnt = 1; //当前位置要填的数
int pos = 0; //当前的方向
while (cnt <= n * n)
{
arr[x][y] = cnt;
//计算下一个位置
int a = x + dx[pos], b = y + dy[pos];
//判断是否越界
if (a < 1 || a > n || b < 1 || b > n || arr[a][b])
{
//更新出正确的该走的位置
pos = (pos + 1) % 4;
a = x + dx[pos], b = y + dy[pos];
}
x = a, y = b;
cnt++;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%3d", arr[i][j]);
}
puts("");
}
return 0;
}
P1098 [NOIP 2007 提高组] 字符串的展开 - 洛谷
c++
#include <bits/stdc++.h>
using namespace std;
int p1, p2, p3, n;
string s;
string ret;
//判断是否是数字
bool isdig(char ch)
{
return ch >= '0' && ch <= '9';
}
//判断是否是小写字母
bool islet(char ch)
{
return ch >= 'a' && ch <= 'z';
}
//把left和right之间的字符展开
void add(char left, char right)
{
string t;
for (char ch = left + 1; ch < right; ch++)
{
char tmp = ch;
//处理p1
if (p1 == 2 && islet(tmp)) tmp -= 32;
else if (p1 == 3) tmp = '*';
//处理p2
for (int i = 0; i < p2; i++)
{
t += tmp;
}
}
//处理p3
if (p3 == 2) reverse(t.begin(), t.end());
ret += t;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> p1 >> p2 >> p3 >> s;
n = s.size();
for (int i = 0; i < n; i++)
{
char ch = s[i];
if (s[i] != '-' || i == 0 || i == n - 1) ret += ch;
else
{
char left = s[i - 1], right = s[i + 1];
// 判断是否展开
if (isdig(left) && isdig(right) && right > left ||
islet(left) && islet(right) && right > left)
{
add(left, right);
}
else
{
ret += ch;
}
}
}
cout << ret << endl;
return 0;
}