有趣的图形算法(竞赛热点)

 

用于总结当时的经典题型。

题目:

记得大一刷题有这样一道题:

默认三角形(n=2)是形如下列形状的:

n = 3时是这样的

 

输入一个整数n(1<=n<=9),输出符合题意的图形。

解析:

当时老纠结了,最后才明白需要用递归。。

总结代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>        // Windows下需要,Linux下不需要
#include<math.h>

#define F(i,n) for(int i=0;i<n;i++)
#define MAXN pow(2,10)
int Map[1024][1024];

void Solve(int x,int y,int num)
{
    if(num == 0)
        Map[x][y] = 1;
    else
    {
        int temp = pow(2,num-1);
        Solve(x,y+temp,num-1);
        Solve(x+temp,y+temp*2,num-1);
        Solve(x+temp,y,num-1);
    }
}

int main()
{
    int t = 3;
    srand((unsigned int)time(NULL));
    F(i,t)
    {
        memset(Map,0,sizeof(Map));
        int n = rand()%9 + 1;
        printf("%d\n",n);

        Solve(0,0,n);
        F(j,pow(2,n))
        {
            F(k,pow(2,n+1))
                putchar(Map[j][k]==1 ? '*' : ' ');
            puts("");
        }
    }
    return 0;
}

题目的代码我就不写了,这个是总结的代码,总结代码是随机生成t个整数n,然后根据n输出相关图形。

一个一个说,说的可能有点详(luo)细(suo):

1.头文件:

我在机房玩Ubuntu,结果ubuntu没网....就换成Windows又写了遍,发现Windows需要自己写time.h头文件,而ubuntu不需要....后面需要用time()函数。

math.h是为了使用pow()函数,不需要自己写循环,节省时间。

string.h是为了使用memset()函数,初始化数据。

stdlib.h使用随机数函数srand(),rand()。

2.随机数:

随机数的产生原理是某一时刻(T1)到目前时间(T2)的时间差(最后以秒为单位),然后对n取余,生成0-n的随机数。srand()函数提前给rand()生成一个种子,可以理解为自己定义T1,如果定义为0或NULL,默认为1970年一月一日0点。

3.putchar(),puts()函数:

putchar用于输出单个字符;puts输出时自动换行。快,便捷。

 

 

其他的可以自己理解,这道题主要是思路。不懂或哪里有问题可以评论,谢谢~

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值