菱形打印(曼哈顿距离)

曼哈顿距离
在这里插入图片描述

#include <iostream>
using namespace std;

int main()
{
    int n;
    scanf("%d", &n);
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            if(abs(i-n/2)+abs(j-n/2)<=n/2) printf("*");
            else printf(" ");
        }
        puts("");
    }

    return 0;
}

下面是我大一时候的弱智代码:(看看就得了)

//以下就是c代表字符,n代表三角的行数 
//正三角模板
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n-i;j++)
		printf(" ");
		for(int k=1;k<=2*i-1;k++)
		cout<<c;
		cout<<endl;
	} 


//倒三角模板 
	for(int i=1;i<=n;i++)//行数 下面的空格和字母是一行 ,所以无论到到哪里都是先打印空格 
	{
		for(int j=1;j<=i-1;j++)
		printf(" ");
		for(int k=1;k<=2*(n-i)+1;k++)//字符数 
		cout<<c;
		cout<<endl;
	}

//如果出先合并的问题,就把三角n变为n-1;i变成i+1 ,页就是少遍历一行,原来的行是之前的下一行

在这里插入图片描述
在这里插入图片描述
这个题就是把上面倒三角的n换成了n-1,i换成了i+1;

#include <iostream>
using namespace std;
int main()
{
	int n;
	char c;
	while(cin>>c>>n)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n-i;j++)
			printf(" ");
			for(int k=1;k<=2*i-1;k++)
			cout<<c;
			cout<<endl;
		} 
		
		
		for(int i=1;i<= n-1;i++)//行数 下面的空格和字母是一行 ,所以无论到到哪里都是先打印空格 
		{
			for(int j=1;j<= i+1 -1;j++)
			printf(" ");
			for(int k=1;k<=2*( n - (i+1) ) +1;k++)//字符数 
			cout<<c;
			cout<<endl;
		}

	}
 } 

在这里插入图片描述
在这里插入图片描述

//很多时候我们要通过一定的数学方法先求出n,判断这个三角有多少行 
//沙漏问题,要先以3为数列的头,公差为2,最好记一下n(n+2), 然后因为对称,乘以2 最后加1 就是符号的总个数
 	int n = 0;
	for (int i = 1; i < N; i++) 
	{
		if ((2 * i * (i + 2) + 1) > N) {
			n = i ;
			break;
		}
	}
 

本来我以为套完模板就结束了,但是发现当N为1的时候,pat说最小测试错误,给了18分(总分20),所以需要特判一下

#include <iostream>
using namespace std;
int main()
{
	int N;
	char c;
	cin>>N>>c;
	
	if(N==1)
	cout<<c<<endl<<0;
	else
	{
		int n = 0;
		for (int i = 1; i < N; i++) {
			if ((2 * i * (i + 2) + 1) > N) {
				n = i ;
				break;
			}
		}
		
		//倒三角模板 
		for(int i=1;i<=n;i++)//行数 下面的空格和字母是一行 ,所以无论到到哪里都是先打印空格 
		{
			for(int j=1;j<=i-1;j++)
			printf(" ");
			for(int k=1;k<=2*(n-i)+1;k++)//字符数 
			cout<<c;
			cout<<endl;
		}
		
		//正三角模板
		//正三角模板  n和i 都要变哦 
		for(int i=1;i<=n-1;i++)
		{
			for(int j=1;j<=n-(i+1);j++)
			printf(" ");
			for(int k=1;k<=2*(i+1)-1;k++)
			cout<<c;
			cout<<endl;
		} 
		//上面判断的是刚好不符合条件,所以会大一位 要把n变为n-1;
		//if ((2 * i * (i + 2) + 1) > N)   
		//把i替换为n-1,带入这个判断式子中
		 
		cout<<( N - (2 * (n-1) * (n-1 + 2) + 1) );
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海波东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值