特殊的正方形「掘金日新计划 · 2 月更文挑战」

151 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

特殊的正方形

题目描述

输入n,输出n行n列的由+.组成的正方形,其中最外面一圈全是+,第二圈全是.,...,对于第i圈,如果i是奇数,那么全是+,否则全是.

输入格式

一行,一个整数n。

输出格式

n行,为满足题目要求的正方形。注意不要有行末空格。

样例输入

10

样例输出

++++++++++
+........+
+.++++++.+
+.+....+.+
+.+.++.+.+
+.+.++.+.+
+.+....+.+
+.++++++.+
+........+
++++++++++

数据范围

对于100%的数据,保证2≤n≤100。

思路

这个题思路其实很简单,就是一个前缀和问题或者是后缀和问题,这个题的输出要求是按题目要求输出图形,其实这个样例有点点容易误解,当然这个题有很多的解决措施。首先就是考虑换行,考虑奇数偶数的输入区别问题,这个题当时还是在我学c语言的时候写的,所以用的是char数组,通过两个循环,设置不同的位置不同的标志,完成题目要求。我的设置是一个对称循环,这样的话会少写代码,让代码变得更简洁一点,最后再按要求输出出来就好了。这个题有点偏思维吧,因为要考虑图形是怎么被画出来的,考虑清楚题目中对图形的不同要求和不同的情况,这个题就可以写出来啦。后来感觉这篇文章的字数实在是有点水啦,所以决定再加点话,这篇是我第一次接触代码源的时候写的题,当时还啥都不会,全靠别人帮助才写出来。

代码

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	char a[105][105];
	n++;
	for(int i=1;i<=n-i;i++){
		for(int j=i;j<=n-i;j++){
			if(i%2==1){
				a[i][j]='+';
				a[j][i]='+';
				a[n-i][j]='+';
				a[j][n-i]='+';
			}
			else{
				a[i][j]='.';
				a[j][i]='.';
				a[n-i][j]='.';
				a[j][n-i]='.';
			}
		}
	}
	n--;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%c",a[i][j]);
		}
		if(i!=n) cout<<endl;
	}
	return 0;
}