hdu 2091 空心三角形

本文介绍了一种利用逆向思维解决二维数组填充问题的方法,详细解释了算法实现过程,并分析了常见错误及解决方案。通过实例总结了关键步骤,强调了编程黄金定律的重要性。

运用了上篇博客(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).随着做题数目的增加,愈发意识到那条编程的黄金定律:数据+算法=程序



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值