NO.56|基础算法-模拟|多项式输出|蛇形方阵|字符串的展开|方向向量(C++)

模拟

模拟,顾名思义,就是题⽬让你做什么你就做什么,考察的是将思路转化成代码的代码能⼒

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;
}
相关推荐
玖玖passion16 分钟前
排序专题
算法
kuan_li_lyg17 分钟前
MATLAB - 小车倒立摆的非线性模型预测控制(NMPC)
开发语言·算法·matlab·机器人·mpc·模型预测控制·倒立摆
YKPG21 分钟前
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第七式】程序的编译
linux·c语言·开发语言
微凉的衣柜23 分钟前
VICP(Velocity-based ICP):通过运动校准实现精准姿态估计
人工智能·算法·计算机视觉
lkbhua莱克瓦241 小时前
用c语言实现——一个带头节点的链队列,支持用户输入交互界面、初始化、入队、出队、查找、判空判满、显示队列、遍历计算长度等功能
c语言·数据结构·程序人生·算法·链表·交互·学习方法
虾球xz1 小时前
游戏引擎学习第239天:通过 OpenGL 渲染游戏
c++·学习·游戏·游戏引擎
How_doyou_do1 小时前
相对论大师-记录型正负性质BFS/图论-链表/数据结构
python·算法
奕天者1 小时前
C++学习笔记(三十六)——STL之排序算法
c++·笔记·学习
TNTLWT1 小时前
程序生成随机数
开发语言
ansenXia1 小时前
CentOS系统中排查进程异常终止的日志
开发语言·python