运用了上篇博客(dp数塔)中提到的逆向思维,从底下往上依次向二维数组(对于许多作图题,二维数组是个非常实用的自定义数据)中填入字符c,(当然,不逆向也可以,但是介于我要多多熟悉逆向思考,所以这里就逆向了)。
#include <iostream>
#include <cstdio>#include <cstring>
#define MAX 100
using namespace std;
char a[MAX][MAX];
int main()
{
//freopen("result.txt","w",stdout);
int cnt=1;
char c;
while(cin>>c)
{
if(c=='@')break;
int n;
cin>>n;
if(cnt>1) cout<<endl;
for(int i=0; i<2*n-1; i++){
memset(a[i],' ',sizeof(a[i]));
a[i][2*n-1]=0;
}
a[0][n]=0;
;
for(int i=0; i<2*n-1; i++)a[n-1][i]=c;
for(int i=n-1;i>0;i--)
{
a[i-1][i+n-1]=0;
a[i-1][n-i]=c;
a[i-1][i+n-2]=c;
}
;
for(int i=0; i<n; i++)cout<<a[i]<<endl;
cnt++;
}
//fclose(stdout);
return 0;
}
(1).一开始我开了个45*45大小的数组(数据),提交后就Runtime Error(ACCESS_VIOLATION)
了,这个错误,一般原因就是数组开小了,运行过程中超出了,找了找,原因就在于i<2*n-1,而n<42,乘个2肯定超啊,后来改为100就碰上了PE,这题目要求也是不太一样,要第一例之后每一例输入后输出一空行,还好看了discuss。
(2).本题实现代码(算法):
for(int i=n-1;i>0;i--)
{
a[i-1][i+n-1]=0;
a[i-1][n-i]=c;
a[i-1][i+n-2]=c;
}
通过例子总结出a[i-1][n-i]=c;
a[i-1][i+n-2]=c;
a[i-1][i+n-1]=0;用来控制格式(每行末没有空格)
(3).随着做题数目的增加,愈发意识到那条编程的黄金定律:数据+算法=程序