C++ 算法(模拟)

༺ 个人主页 · 纪念229 ༻

🏠我的博客主页🏠

༒专栏目录:《数据结构》༒

༒专栏目录:《算法》༒

༒专栏目录:《C++》༒

༒专栏目录:《MySQL数据库》༒

༒专栏目录:《前端开发》༒

༒其它有趣的计算机知识༒

༺世上本没有路,走的人多了自然就有了༻


本篇文章讲述的是C++基本算法模版中的模拟,其实就是先把题目要求做的事在草稿纸上写好然后根据要求写代码(个人觉得有点难难在理解题意还要将其转化为代码这也是算法竞赛第一题上位置的题目)

以后我会更新算法基础的文章要讲解的东西一般就是()里面的东西,有关算法基础的题目以后都是全代码模式以后就不赘述了

多项式输出

蛇形方阵


文章目录


1.多项式输出

题目要求我们输入最大次数

然后在输入每个次数的系数

c 复制代码
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	int n; cin >> n;
	for(int i = n; i>=0; i--)
	{
		int num; cin >> num;
		char ch;
//		if(i == n){
//		ch = num > 0 ? '' : '-';	//char对象里没有''字符建议不存直接先打印 
//		}else{
//			ch = num > 0 ? '+' : '-';
//		}
        //先打印正负字符 
	    if(i == n){
	    	if(num < 0) cout << '-';
			}else{
			if(num > 0) cout << '+';
			if(num < 0) cout << '-';
		}
		//再打印数字 最后打印次方 
		num = abs(num);//abs作用取整数的绝对值头文件是cmath 
	    //num为0时什么都不打 
		if(num == 1){
			//如果i == 0的时候直接打印数字 
			  if(i == 0) cout << num;
	          if(i == 1) cout << 'x';
	          if(i > 1) cout << "x^" << i;
		}
		if(num > 1){
			if(i == 0) cout << num;
			if(i == 1) cout << num << 'x';
			if(i > 1) cout << num << "x^" << i; 
		}
	}
	return 0;
}

这里我们推断出打印多项式首先是看符号(如果是刚开始系数小于0就打印字符'-'大于0不用管之后系数大于0打印'+'小于0打印'-')然后看系数因为我们先管了符号所以我们首先要将系数取绝对值然后我们还要分为三种情况系数为0(直接不管即可)系数为1我们要看次数为几次数为0直接打印系数次数为1就直接打印x如果次数大于1我们就打印x的次方其次系数大于1当次数为0直接打印系数当次数为1先打印系数再打印x如果次数大于1先打印系数再打印x的次方

是的模拟很麻烦我们必须要在草稿纸上写好条件还要将其实现下来(其实做大多数算法题都需要草稿纸)

这里我就讲一下核心代码

c 复制代码
int n; cin >> n;
	for(int i = n; i>=0; i--)
	{
		int num; cin >> num;
		char ch;
//		if(i == n){
//		ch = num > 0 ? '' : '-';	//char对象里没有''字符建议不存直接先打印 
//		}else{
//			ch = num > 0 ? '+' : '-';
//		}
        //先打印正负字符 
	    if(i == n){
	    	if(num < 0) cout << '-';
			}else{
			if(num > 0) cout << '+';
			if(num < 0) cout << '-';
		}
		//再打印数字 最后打印次方 
		num = abs(num);//abs作用取整数的绝对值头文件是cmath 
	    //num为0时什么都不打 
		if(num == 1){
			//如果i == 0的时候直接打印数字 
			  if(i == 0) cout << num;
	          if(i == 1) cout << 'x';
	          if(i > 1) cout << "x^" << i;
		}
		if(num > 1){
			if(i == 0) cout << num;
			if(i == 1) cout << num << 'x';
			if(i > 1) cout << num << "x^" << i; 
		}
	}

我们首先输入n定义该多项式最多为n次

我们利用for循环先从n开始到0也就实现了输出的基本框架

然后我们定义一个num输入系数

c 复制代码
 if(i == n){
	    	if(num < 0) cout << '-';
			}else{
			if(num > 0) cout << '+';
			if(num < 0) cout << '-';
		}

首先我们要看正负符号分两种一种次数为n一种次数不为n为n的话我们看它的系数小于0的话就打印'-'其它不管系数为0符号什么都不打印次数不为1的话系数大于0打印符号'+'小于0打印'-'

然后我们将num取绝对值调用函数abs()将整形数据的负号去掉

abs的头文件是cmath

然后我们将系数分为三种为0为1大于1

为0什么都不用打印

为1当次数为0的话直接打印系数为1的话直接打印x大于一的话打印x的次方

系数大于1的话当次数为0时打印系数次数为1时打印系数再打印x系数大于1打印系数再打印x的次方

c 复制代码
if(num == 1){
			//如果i == 0的时候直接打印数字 
			  if(i == 0) cout << num;
	          if(i == 1) cout << 'x';
	          if(i > 1) cout << "x^" << i;
		}
		if(num > 1){
			if(i == 0) cout << num;
			if(i == 1) cout << num << 'x';
			if(i > 1) cout << num << "x^" << i; 
		}

2.蛇形方阵

给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。

从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字都会占用 3 个字符,前面使用空格补齐。

题目意思很简单就是我们输入一个数字n我们就设计一个长宽都为n的矩形从左上角开始顺时针填充数字第一个填1之后每填一个改数字就加一

这种矩形填充数的方式我们建议用向量法(我们定义两个数组写好每个数组都有4个元素用一个下标决定它处于哪个位置4个下标定义着4个在矩形的4个方向当我们越界时就更新下标改变移动方向)

c 复制代码
#include<iostream>

using namespace std;
    const int N = 15;//下标大于等于10就可以因为矩阵最大为9 
	int arr[N][N];//数组在全局未定义 
	//顺时针填矩阵用向量法填矩阵 
	//向量法在矩阵填数据我们从1,1开始填0,x和0, x不用管这样填数据更好看 
    //顺时针插入右下左上利用pos 实行上下左右的移动 
	int dx[] = {0,1,0,-1};
    int dy[] = {1,0,-1,0};
int main()
{
	int n; cin >> n;

    int x = 1, y = 1, pos = 0;//利用pos下标确定移动方向,下标x,y确定路径位置 
    int cunt = 1;//利用cunt作为填入的数据 
	//利用while循环遍历顺时针插入矩阵
	while(cunt <= n*n)
	{
	  arr[x][y] = cunt;
	  //利用a,b更新坐标位置
	  int a = x + dx[pos], b = y + dy[pos];
	  //越界/遇到已经插入的地方就更新方向
	  if(a < 1 || a > n || b < 1 || b > n || arr[a][b])//因为没插入的地方默认为0(因为数组定义在全局未初始化默认所有元素为0)遇到非0的就说明到了以插入的地方 
	  {
	  	pos = (pos + 1) % 4;
		//更新正确坐标 
		a =  x + dx[pos], b = y + dy[pos];
	  }
	  //更新坐标 
	  x = a, y = b;
	  //最后++count循环遍历
	  cunt++; 
	} 
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			//题目只要求打印的数字占三个字符没要求空格 
			printf("%3d", arr[i][j]);//最后利用下标(i,j)打印插入数组 
		}
		puts("");//作用打印字符串之后自动添加换行符 
	}
	return 0;
}

首先题目要求我们最大数组边界不会大于9所以我们定义一个大于等于10的矩形在全局即可(定义在全局对向量移动有大作用)

c 复制代码
const int N = 15;//下标大于等于10就可以因为矩阵最大为9 
int arr[N][N];//数组在全局未定义 

我们定义dx和dy作为方向向量作为移动的反向

c 复制代码
	int dx[] = {0,1,0,-1};
    int dy[] = {1,0,-1,0};

这里我们设计的方向向量设计的是顺时针右下左上(我们这里坐标轴正下是x轴方向正右是y轴方向)

c 复制代码
int n; cin >> n;

    int x = 1, y = 1, pos = 0;//利用pos下标确定移动方向,下标x,y确定路径位置 
    int cunt = 1;//利用cunt作为填入的数据     

首先我们先定义一个n输入n决定数组的边界

在定义x,y为1,pos为0

x y是矩形数组的下标 pos是向量数组的下标

x和y为1开始我们从1,1开始(0,x)和(x, 0)我们都不用管我们从(1,1)开始是为了方便运算移动好看

c 复制代码
while(cunt <= n*n)
	{
	  arr[x][y] = cunt;
	  //利用a,b更新坐标位置
	  int a = x + dx[pos], b = y + dy[pos];
	  //越界/遇到已经插入的地方就更新方向
	  if(a < 1 || a > n || b < 1 || b > n || arr[a][b])//因为没插入的地方默认为0(因为数组定义在全局未初始化默认所有元素为0)遇到非0的就说明到了以插入的地方 
	  {
	  	pos = (pos + 1) % 4;
		//更新正确坐标 
		a =  x + dx[pos], b = y + dy[pos];
	  }
	  //更新坐标 
	  x = a, y = b;
	  //最后++count循环遍历
	  cunt++; 
	} 
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			//题目只要求打印的数字占三个字符没要求空格 
			printf("%3d", arr[i][j]);//最后利用下标(i,j)打印插入数组 
		}
		puts("");//作用打印字符串之后自动添加换行符 
	}

在外面定义一个cunt为1

利用whlie循环遍历 n*n次因为我们要插入n * n次 cunt <= n * n

首先我们利用x,y在该位置插入cunt然后定义a和b来更新向量方向分两种情况正常移动更新下标和遇到越界或非0数据我们就更新向量方向再更新坐标

最后将a和b(更新好的下标)放入x 和y最后将cunt++继续循环

c 复制代码
 int a = x + dx[pos], b = y + dy[pos];
	  //越界/遇到已经插入的地方就更新方向
	  if(a < 1 || a > n || b < 1 || b > n || arr[a][b])//因为没插入的地方默认为0(因为数组定义在全局未初始化默认所有元素为0)遇到非0的就说明到了以插入的地方 
	  {
	  	pos = (pos + 1) % 4;
		//更新正确坐标 
		a =  x + dx[pos], b = y + dy[pos];
	  }
	  //更新坐标 
	  x = a, y = b;
	  //最后++count循环遍历
	  cunt++; 

这里更新向量方向其实就是改变pos下标

每次加一 / 4当到了上以后加就有回到右

c 复制代码
for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			//题目只要求打印的数字占三个字符没要求空格 
			printf("%3d", arr[i][j]);//最后利用下标(i,j)打印插入数组 
		}
		puts("");//作用打印字符串之后自动添加换行符 
	}

最后利用两个for循环将填好的数据打印出来题目要求每个数据以三字节打印不需要空格只要每个循环之后换行即可


文章到此就告一段落,希望对你有所帮助,感谢观看!

相关推荐
揽星河..44 分钟前
【C语言】函数
c语言·算法
zwc32104320551 小时前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉
niucloud-admin1 小时前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:评价列表
开发语言·php
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 项目:需求分析与滑动数据设计
java·开发语言·交友
重生之小比特1 小时前
【算法拾光】模拟|提莫攻击 + N 字形变换
算法·模拟
gz927cool1 小时前
Python 全栈应用最佳实践完整指南
开发语言·python·ai
道尔柯南1 小时前
C++ 内存管理详解:从 malloc/free 到 new/delete
c++·面试
東隅已逝,桑榆非晚1 小时前
AVL数实现
c++·笔记·学习·算法
CoderYanger2 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc