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;
}
相关推荐
蜉蝣之翼❉9 分钟前
CRT 不同会导致 fopen 地址不同
c++·mfc
Boilermaker199214 分钟前
【Java EE】Mybatis-Plus
java·开发语言·java-ee
aramae19 分钟前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
Tony小周19 分钟前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
lifallen38 分钟前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
lixzest39 分钟前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
EndingCoder42 分钟前
搜索算法在前端的实践
前端·算法·性能优化·状态模式·搜索算法
丶小鱼丶1 小时前
链表算法之【合并两个有序链表】
java·算法·链表
沉默媛1 小时前
如何安装python以及jupyter notebook
开发语言·python·jupyter
不吃洋葱.1 小时前
前缀和|差分
数据结构·算法