题解:P13426 [COCI 2020/2021 #2] Crtanje
zybgml_AFO · · 题解
题目链接:P13426 [COCI 2020/2021 #2] Crtanje
这道题其实不难,但如果找不到一个合适的方法,真的比较难实现。
大体思路
第一步:确定最小矩阵
最小矩阵的求法较为简单:
我的方法是设一个变量表示公司净资产,然后根据
第二步:确定曲线
这一步也是本题的难点。为了确定曲线中每一个点的位置,我们要先观察其规律: 根据规律我们即可求出每一个点的位置了。以下为伪代码:
h[i]=z;
if(a[i]=='='&&a[i+1]=='-') z--;
if(a[i]=='+'&&a[i+1]!='-') z++;
if(a[i]=='-'&&a[i+1]=='-') z--;
确定曲线中每一个点的位置后,我们只需打印出曲线矩阵即可。
详细代码
#include <bits/stdc++.h>
using namespace std;
int n,z=100,mx=100,mn=100;//初始公司净资产设为100,防止下标越界
int h[1005];//记录曲线中每一个点的位置
char a[1005];//记录净资产变化
char s[1005][1005];//输出的曲线矩阵
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
h[i]=z;//记录曲线中每一个点的位置
mx=max(mx,z);//求净资产最大值
mn=min(mn,z);//求净资产最小值
if(a[i]=='='&&a[i+1]=='-') z--;
if(a[i]=='+'&&a[i+1]!='-') z++;
if(a[i]=='-'&&a[i+1]=='-') z--;
/*
if求曲线中下一个点的位置
*/
}
for(int i=1;i<=n;i++){
for(int j=mn;j<=mx;j++){
if(j==h[i]) s[j][i]=a[i];
else s[j][i]=='.';
/*
将输出矩阵成型
*/
}
}
for(int i=mx;i>=mn;i--){
for(int j=1;j<=n;j++){
if(s[i][j]=='+') cout<<"/";
else if(s[i][j]=='-') cout<<char(92);//我太蒻了,发现不能直接输出反斜杠,只好这样。
else if(s[i][j]=='=') cout<<"_";
else cout<<'.';
}
cout<<endl;
}
}