将思路转换为代码能力,注意分类讨论
例题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; }