20141202-Z字形扫描

近期写算法最笨蛋的方法了真是😂
简洁版不分上下两种情况 直接将一个正方形拓展面 向右向下分别拓展 以构成一个边长为2n的等腰三角形

拓展面:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 510;
int main()
{
	int n;
	cin >> n;
	int c[maxn][maxn];
	for(int i = 0; i < n; i++)
	{
		for(int j =0; j < n; j++)
		{
			cin >> c[i][j];
		}
	}
	for(int i = 0; i <= 2 * n -1; i++)// 横纵坐标之和
	{
		if(i % 2)//奇数向下
		{
			for(int j = 0; j <= i;j++)
			{
				if(j >= 0 && j < n && i - j >= 0 && i - j < n) cout << c[j][i-j] << " ";
			}

		}
		else //偶数向上
		{
			for(int j = i; j >= 0; j--)
			{
				if(j >= 0 && j < n && i - j >= 0 && i - j < n) cout << c[j][i-j] << " ";
			}
		}
	}
	return 0;
}

标志法:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 510;
int main()
{
	int n;
	cin >> n;
	int c[maxn][maxn];
	for(int i = 0; i < n; i++)
	{
		for(int j =0; j < n; j++)
		{
			cin >> c[i][j];
		}
	}
	int x = 0, y = 0;
	bool flag = true;
	while(x != n || y != n)
	{
		if(x < n && y < n) cout << c[x][y] << " ";
		if(flag) x--,y++;
		else x++,y--;
		if(x < 0) 
		{
			x = 0; 
			flag = !flag;
		}
		if(y < 0)
		{
			y = 0;
			flag = !flag;
		}
	}
	return 0;
}

笨蛋方法:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 510;
int main()
{
	int n;
	cin >> n;
	int c[maxn][maxn];
	for(int i = 0; i < n; i++)
	{
		for(int j =0; j < n; j++)
		{
			cin >> c[i][j];
		}
	}
	int x, y;
	for(int i = 0; i < n; i++)
	{
		if(i % 2 == 0) //偶数向上(x,y)
		{
			x = i; 
			y = 0;
			while(1)
			{
				cout << c[x][y] << " ";
				x--;
				y++;
				if(x == -1) break;
			}
		}
		else//
		{
			x = 0;
			y = i;
			while(1)
			{
				cout << c[x][y] << " " ;
				x++;
				y--;
				if(y == -1) break;
			}
		}
	}
	if(n % 2 == 0)
	{
		for(int i = 1; i < n; i++)
		{
		if(i % 2 != 0) 
		{
			x = n-1; 
			y = i;
			while(1)
			{
				cout << c[x][y] << " ";
				x--;
				y++;
				if(y == n) break;
			}
		}
		else
		{
			x = i;
			y = n-1;
			while(1)
			{
				cout << c[x][y] << " " ;
				x++;
				y--;
				if(x == n) break;
			}
		}
	}
	}
	else
	{
		for(int i = 1; i < n; i++)
		{
		if(i % 2 == 0) 
		{
			x = n-1; 
			y = i;
			while(1)
			{
				cout << c[x][y] << " ";
				x--;
				y++;
				if(y == n) break;
			}
		}
		else
		{
			x = i;
			y = n-1;
			while(1)
			{
				cout << c[x][y] << " " ;
				x++;
				y--;
				if(x == n) break;
			}
		}
	}

	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

moumoumouwang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值