[蓝桥杯]回形取数

[蓝桥杯][基础练习VIP]回形取数

时间限制: 1Sec 内存限制: 128MB 提交: 493 解决: 139

题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3

1 2 3

4 5 6

7 8 9
样例输出
1 4 7 8 9 6 3 2 5

解题思路

while(结束输出条件)
{
	while(向下)
	{输出合法下一位,改变当前变量位置,填充标记数组,[辅助flag]}
	while(向右)
	{输出合法下一位,改变当前变量位置,填充标记数组,[辅助flag]}
	while(向上)
	{输出合法下一位,改变当前变量位置,填充标记数组,[辅助flag]}
	while(向左)
	{输出合法下一位,改变当前变量位置,填充标记数组,[辅助flag]}
}

注意问题中的m和n是不定长(第一次以为是对称的二维数组,就用找规律的方法做了,就错啦)

完整代码

#include<iostream>
using namespace std;

int main()
{
	int m,n;
	int nn[220][220];
	cin>>m>>n;
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			cin>>nn[i][j];
	int x=0,y=0;
	int f[220][220];
	cout<<nn[x][y];
	f[0][0]=1;
	int num=1;
	while(m*n>num)
	{
		while(x+1<m && f[x+1][y]!=1)
		{
			cout<<" "<<nn[x+1][y];
			x++;
			f[x][y]=1;
			num++;
		}
		while(y+1<n && f[x][y+1]!=1)
		{
			cout<<" "<<nn[x][y+1];
			y++;
			f[x][y]=1;
			num++;
		}
		while(x-1>=0 && f[x-1][y]!=1)
		{
			cout<<" "<<nn[x-1][y];
			x--;
			f[x][y]=1;
			num++;
		}
		while(y-1>=0 && f[x][y-1]!=1)
		{
			cout<<" "<<nn[x][y-1];
			y--;
			f[x][y]=1;
			num++;
		}
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值