算法基础篇(2)模拟
模拟,顾名思义,就是题目让你做什么你就做什么,考查的是将思路转换为代码的能力。这类题通常较为简单,属于竞赛里面的签到题,我们在学习语法阶段接触的题大多数都属于模拟题。
1、多项式输出
算法原理:根据题目模拟 + 分类讨论
如果我们单独看这个多项式其中一项的话,我们会发现这一项可以分成三个部分:系数、变量x和指数,而系数又可以分为符号 + 一个数的绝对值。所以我们输出就可以一项一项地输出,每一项关心三个部分:符号、数 和 次数。
参考代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cmath>
using namespace std;int main()
{int n = 0;cin >> n;for (int i = n;i >= 0;i--){int a = 0;cin >> a;//处理系数为0的情况if (a == 0)continue;//1.符号if (a < 0){cout << '-';}else{if (i != n)cout << '+';}//2.数字a = abs(a);if (a != 1)cout << a;else{if (i == 0)cout << a;}//3.次数if (i == 0)continue;else if (i == 1)cout << 'x';elsecout << "x^" << i;}return 0;
}
2、蛇形方阵
算法原理:模拟填数的过程
实现的方式有很多种,这里介绍一种通用的解法来解决矩阵中填数的题目:
①定义方向向量
②根据规则结合方向向量来填数。
参考代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cstdio>
using namespace std;const int N = 10;//定义 右、下、左、上 四个方向
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };int arr[N][N];int main()
{int n = 0;cin >> n;//模拟填数过程int num = 1; //当前位置要填的数int pos = 0; //当前的方向int x = 1, y = 1; //初始位置while (num <= n * n){arr[x][y] = num;//计算下一个位置int a = x + dx[pos];int 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;num++;}//输出for (int i = 1;i <= n;i++){for (int j = 1;j <= n;j++){printf("%3d", arr[i][j]);}cout << endl;}return 0;
}
3、字符串的展开
参考代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int p1, p2, p3;
string s;
string ret;//判断是否是数字字符
bool isdig(char ch)
{return ch >= '0' && ch <= '9';
}//判断是否是小写字母
bool islet(char ch)
{return ch >= 'a' && ch <= 'z';
}//把 [left, right]之间的字符 展开
//left和right 这两个字符不做处理
void add(char left, char right)
{string t;//遍历中间的字符for (char ch = left + 1;ch < right;ch++){char tmp = ch;//处理p1if (p1 == 2 && islet(ch)){tmp -= 32;//小写变大写}else if (p1 == 3){tmp = '*';//变成星号}//处理p2for (int i = 0;i < p2;i++){t += tmp;}}//处理p3if (p3 == 2){reverse(t.begin(), t.end());}ret += t;
}int main()
{cin >> p1 >> p2 >> p3;cin >> s;size_t 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];char right = s[i + 1];//判断是否展开if ((isdig(left) && isdig(right) && left < right) ||(islet(left) && islet(right) && left < right)){//展开add(left, right);}else{ret += ch;}}}cout << ret << endl;return 0;
}