特殊的正方形<每日一题>(图解)

题目:


题目链接:特殊的正方形 - 题目 - 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:去年今日此门中,人面桃花相映红。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CTGU-Yoghurt

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

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

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

打赏作者

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

抵扣说明:

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

余额充值