1.算法题之模拟

将思路转换为代码能力,注意分类讨论

例题1.洛谷:P1067 [NOIP2009 普及组] 多项式输出

依次进行分类讨论:符号,系数,次数;注意多项式的系数不为0;

代码如下:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int n;
	cin >> n;
	for(int i=n;i>=0;i--)//n+1次操作
	{
		int x;
		cin >> x; 
		//先判断一下符号
		if(x==0) 
			continue;
		else if(x>0&&i!=n) //首行没有符号 
			cout << '+'; 
		else if(x<0)
			cout << '-';//注意不要直接写 else{cout << '-'}; 
		//再写系数
		x=abs(x);//绝对值
		if(x!=1||(x==1&&i==0))
			cout << x;
		//最后写次数
		 if(i==1)
		 cout << 'x';
		 else if(i!=1&&i!=0)
		 cout << 'x' << '^' << i;
	} 
	return 0;
}

例题2洛谷P5731 【深基5.习6】蛇形⽅阵

考察填数的通用解法方向向量

定义⽅向向量,⽐如本题⼀共四个⽅向,分别是右、下、左、上,对应:
(0, 1)、(1, 0)、(0, −1)、(−1, 0);

朝⼀个⽅向⾛,⼀边⾛⼀边填数,直到越界;

越界之后,结合定义的⽅向向量,求出下⼀轮应该⾛的⽅向以及应该到达的正确位置;

重复上述过程,直到把所有的数填完为⽌。

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
const int N=15;
int a[N][N];
int dx[]={0,1,0,-1};//定义方向向量 
int dy[]={1,0,-1,0};//定义方向向量
int cnt=1;//从1开始填 
int x=1,y=1;//初始位置 
int p=0;//与dx,dy一起使用 
int main()
{
	int n;
	cin >> n;
	while(cnt<=n*n)
	{
		//填数
		a[x][y]=cnt;
		//预先试着移动
		int x1=x+dx[p];
		int y1=y+dy[p];
		//判断越界
		if(x1<1||y1<1||x1>n||y1>n||a[x1][y1]!=0)
		{
			//调整 
			p=(p+1)%4;//形成闭环 
			x1=x+dx[p];
			y1=y+dy[p];
		}
		//移动
		 x=x1;
		 y=y1;
		 cnt++;
	}
	//打印
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%3d",a[i][j]);
		}
		cout << endl;
	}
	return 0;
}

例题3洛谷P1098 [NOIP2007 提⾼组] 字符串的展开

根据规则模拟字符串展开的过程即可。
题⽬的规则较⻓,但是叙述的⾮常详细,只要把「细节」考虑到位,「分类讨论」就能搞定。

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string s2;
int p1,p2,p3;
bool math(char ch)
{
	return ch>='0'&&ch<='9';
}
bool english(char ch)
{
	return ch>='a'&&ch<='z';
}
void add(char left,char right)
{
	string s3;
	for(char c=left+1;c<=right-1;c++)//遍历中间的字符串
	{
		char temp=c;
		if(p1==2&&english(c))
		temp-=32;
		for(int i=1;i<=p2;i++)
		{
			if(p1==3)
			{
				s3+="*";
			}
			else
			s3+=temp;
		}
	}
		if(p3==2)
		{
			reverse(s3.begin(),s3.end());

		}
		s2+=s3;
	} 
int main()
{
	cin >> p1 >> p2 >> p3;
	string s;
	cin >> s;
	//遍历
	int n=s.size();
	for(int i=0;i<n;i++)
	{
		if(s[i]!='-'||i==0||i==n-1)
		s2+=s[i];
		else
		{
			char left=s[i-1];
			char right=s[i+1];
			if((math(left)&&math(right)&&left<right)||(english(left)&&english(right)&&left<right))//模块化 
			{
				add(left,right);
			}
			else
			s2+=s[i];
		}
	}
	cout << s2 << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值