题目:
题目链接:特殊的正方形 - 题目 - Daimayuan Online Judge
思路:
这个题就是外一层
然后里一层的循环
我们可以把这个题看作蛇形数组
从起点开始
向右边遍历
然后向下遍历
向左遍历
向上遍历
这样就遍历完了一圈
然后从头开始遍历第2圈
直到把nxn的正方体全部遍历完
记得每次的遍历都要进行
对到过的地方标记
而且通过标记是第几圈来标记我们要给它填入的
字符是什么的操作
行动图:
注:
另外我们还需要知道的规律:
当n为偶数时
正方形只能有 n/2 层圈组成(如6X6的正方形有3圈)
n为奇数时
正方形只能有n/2+1 层圈组成(如5*5的正方形也有3圈)
代码详解:
#include<stdio.h>
#include<iostream>
using namespace std;
int vis[106][106];//用来标记是否走过这个位置
int map[106][106];//用来标记该位置的字符为什么
int main()
{
int n;
cin >> n;
int i = 1, j = 1;
vis[i][j] = 1;//对初始位置进行标记
map[i][j] = 1;//对初始位置进行标记
int step = 0;
int flag = 0;
if (n & 1) flag = 1;//判断是否为奇数
while (1)
{
while (vis[i][j+1] == 0&&j<n)//向右边走
{
vis[i][j+1] = 1;//标记该位置走过
map[i][j + 1] = 1;//标记该位置字符是什么,1代表 +
j++;//进行下一步
}
while (vis[i+1][j] == 0 && i < n)//向下边走
{
vis[i+1][j] = 1;
map[i+1][j ] = 1;
i++;
}
while (vis[i][j-1] == 0 && j>1)//向左边走
{
vis[i][j-1] = 1;
map[i][j - 1] = 1;
j--;
}
while (vis[i-1][j] == 0 && i >1)//向上边走
{
vis[i-1][j] = 1;
map[i - 1][j] = 1;
i--;
}
step++;//对走的圈数进行统计
while (vis[i][j + 1] == 0 && j < n)//向右边走
{
vis[i][j + 1] = 1;
map[i][j + 1] = 2;//2代表 .
j++;
}
while (vis[i + 1][j] == 0 && i < n)//向下边走
{
vis[i + 1][j] = 1;
map[i + 1][j] = 2;
i++;
}
while (vis[i][j - 1] == 0 && j >= 1)//向左边走
{
vis[i][j - 1] = 1;
map[i][j - 1] = 2;
j--;
}
while (vis[i - 1][j] == 0 && i >= 1)//向上边走
{
vis[i - 1][j] = 1;
map[i - 1][j] = 2;
i--;
}
step++;//对走的圈数进行统计
if (flag == 1 && step >= n / 2 + 1) break;//因为可能存在 . 没有走圈的情况,故只需要圈数大于或等于都可以跳出循环
else if (flag == 0 && step >= n / 2) break;
}
for (int i = 1; i <= n; i++)//输出题目要求构造的图行
{
for (int j = 1; j <= n; j++)
{
if (map[i][j] == 1)
printf("+");
else
printf(".");
}
printf("\n");//每一次行输出,换行
}
return 0;
}
PS:去年今日此门中,人面桃花相映红。