新兵勋章

题目描述

安杰在你们的帮助下成功通过了前两轮的测试,现在彩虹小队没人再叫他猴子了。鉴于他的优良表现(其实是你们的),彩虹小队决定给安杰颁发新兵勋章。新兵勋章是一个V字形,每个人都有特定的尺寸和样式,现在给你安杰的尺寸大小和他想要的样式,你能画出安杰的新兵勋章吗?(当尺寸为偶数时,安杰想要将它反过来)

输入

输入数据由多组测试样例组成,每组占一行。包含一个整数n(1<=n<=50)和一个字符c,分别表示尺寸和样式。

输出

对于每组测试样例,输出新兵勋章的样式,且输出一个额外的空行。

样例输入

1 a
2 @

样例输出

在这里插入图片描述

思路

首先我们把它分成两个部分来写
一个是偶数一个是奇数
根据规律我们可以得到最长的那条边是3+4n
有2+n
2层
勋章上层2n之前和n3+2之后都是勋章的符号
勋章最外面的边都也是符号
我们可以先吧最外面一圈先画上
最外面的边设置两个变量
1 和 3+4n-1
一个累加一个累减
就能把最外面一圈画好
这时候话内圈
根据找到的规律内圈也是两个变量
2
n 和 n*3+2
一个累加一个累减
判断如果是到了这个位置就画符号
最后当两个值相等时候就连接上了

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	char m;
	while(cin>>n>>m){
			int l=3+n*4;
			int r=2+n*2;
			int q=1;
			int c=2+n,d=n*3+2;
			int f=1;
		if(n%2){
			for(int i=1;i<=r;i++){
				for(int j=1;j<=l;j++){
					if(i==1){
						if(j<=c||j>=d)cout<<m;
						else cout<<" ";
					}else if(i==r){
						if(j==l)cout<<m;
						else cout<<" ";
					}else if(i>1&&i<r){
						if(j==l||j==q)cout<<m;
						else if(j==c||j==d){
							if(f){
								if(c==d){
									cout<<m;
									f=0;
								}
								else cout<<m;
							}else cout<<" ";
						}else cout<<" ";
					}
				}
				l--;
				q++;
				c++;
				d--;
				cout<<endl;
			}
		}else{
			l=l-r+1;
			q=l;
			c=2+2*n;
			d=2+2*n;
			f=0;
			for(int i=1;i<=r;i++){
				for(int j=1;j<=l;j++){
					if(i==1){
						if(j==l)cout<<m;
						else cout<<" ";
					}else if(i==r){
						if(j<=2+n||j>=n*3+2)cout<<m;
						else cout<<" ";
					}else if(i>1&&i<r){
						if(i>=(r/2)+1)f=1;
						if(j==l||j==q)cout<<m;
						else if(j==c||j==d){
							if(f){
								if(c==d){
									cout<<m;
								}
								else cout<<m;
							}else cout<<" ";
						}else cout<<" ";
					}
				}
				l++;
				q--;
				if(f){
					c--;
					d++;
				}
				cout<<endl; 
			}
		}
		cout<<endl;
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值