原题链接:特殊的正方形 - 题目 - Daimayuan Online Judge
解题思路:本题只要按照要求输出即可。需要注意的是因为其计数是从外向内,所以上半部分与下半部分的计数方向相反,左右亦是如此。
如果不切换计数模式,可以在通过中线时交换两个符号的奇偶(因为最中间的行列都是连续两个相同符号)。
在供参考的AC代码中,奇数输出部分采用了前者,更换了计数方向。而偶数输出部分则采用后者,更换了符号的奇偶对应。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
void evenNum(){//偶数行列输出函数
for(int i=1;i<=n;i++){//行数循环
for(int j=1;j<=n;j++){//列数循环
if((j>=i&&j<=n+1-i&&i<=n/2)||(j<=i&&j>=n+1-i&&i>=n/2)){//输出每一圈的上下边框
if(i<=n/2){//判断上下,上半部分从1到n/2的部分,奇数行是+,偶数行是.
if(i%2==1) printf("+");
else printf(".");
}
else {//下半部分从n/2+1到n的部分,因为n/2+1算作第一行
//但是上下对称,如果上一行是+,这一行也是+,反之亦然。中间两行重复输出同一个字符两次,奇偶互换。所以奇数行是.,偶数行是+
if(i%2==1) printf(".");
else printf("+");
}
}
else{//如果不是圈的上下边框,输出左右边框
if(j<=n/2){//判断左右,左半部分从1到n/2的部分,奇数列是+,偶数列是.
if(j%2==1) printf("+");
else printf(".");
}
else{//左半部分从n/2+1到n的部分,因为n/2+1算作第一行列
//但是左右对称,如果上一列是+,这一列也是+,反之亦然。中间两列重复输出同一个字符两次,奇偶互换。所以奇数行是.,偶数行是+
if(j%2==1) printf(".");
else printf("+");
}
}
}
printf("\n");
}
}
void oddNum(){
for(int i=1;i<=n;i++){//行循环
if(2*i-1==n){//如果是最中间的一行特殊处理
printf("+");//从左往右起始必定是+
for(int j=1;j<n;j+=2){//中间一行必定两符号间隔输出
printf(".+");
}
printf("\n");
continue;
}
for(int j=1;j<=n;j++){//不是中间一行则进入该循环
if((j>=i&&j<=n+1-i&&i<=n/2)||(j<=i&&j>=n+1-i&&i>n/2+1)){//输出每一圈的上下边框
if(i<=n/2){//如果是上半部分按照从上往下计数,规则与题面一致
if(i%2==1) printf("+");
else printf(".");
}
else{//如果是下半部分按照从下往上计数,规则与题面一致
if((n+1-i)%2==1) printf("+");
else printf(".");
}
}
else{
if(j<=n/2){//如果是左半部分按照从左往右计数,规则与题面一致
if(j%2==1) printf("+");
else printf(".");
}
else{//如果是右半部分按照从右往左计数,规则与题面一致
if((n+1-j)%2==1) printf("+");
else printf(".");
}
}
}
printf("\n");
}
}
int main(){
cin>>n;
if(n%2==0){//如果是偶数行列,执行以下函数
evenNum();
}
else{//如果是奇数行列,执行以下函数
oddNum()
; }
return 0;
}