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;
}
相关推荐
九亿AI算法优化工作室&1 小时前
SA模拟退火算法优化高斯回归回归预测matlab代码
人工智能·python·算法·随机森林·matlab·数据挖掘·模拟退火算法
UestcXiye1 小时前
《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型
c++·计算机网络·ip·tcp
么耶咩_5151 小时前
排序复习_代码纯享
数据结构·算法
Blossom.1181 小时前
基于Python的机器学习入门指南
开发语言·人工智能·经验分享·python·其他·机器学习·个人开发
郝YH是人间理想2 小时前
Python面向对象
开发语言·python·面向对象
藍海琴泉2 小时前
蓝桥杯算法精讲:二分查找实战与变种解析
python·算法
大刀爱敲代码3 小时前
基础算法01——二分查找(Binary Search)
java·算法
大土豆的bug记录4 小时前
鸿蒙进行视频上传,使用 request.uploadFile方法
开发语言·前端·华为·arkts·鸿蒙·arkui
hhw1991126 小时前
c#知识点补充3
开发语言·c#
Antonio9156 小时前
【Q&A】观察者模式在QT有哪些应用?
开发语言·qt·观察者模式