螺旋矩阵

刚刚做完tencent的实习生招聘笔试。两个小时,第一小时是30道客观不定项选择,考的很全面也挺基础,数据结构、网络、OS、数据库、C、JAVA……【然并卵,并不会。第二个小时是一道简答三道编程。简答问的是stack和heap的区别,编程是一道SQL,两道算法。其实应该都很简单,然而还没学SQL所以放弃了。尽管如此还是只完成了一道,螺旋矩阵。另一道可删除寻找回形文,以前做过回形文的题目,但是没有可以删除的条件,然而开始做的时候已经没有时间了……sad,还是自己太弱。


看了一下网上有的螺旋矩阵的算法,好像和我想的不太一样,所以趁着还能记得写下来一点。


螺旋矩阵,就是类似下面这样的矩阵,输入行(列)数n,输出一个n*n的矩阵。


其实是很简单自然的想法,就是按照数字增大的方向逐个赋值。


#include <iostream>
using namespace std;
#define M 100
int ans[M][M];
int main()
{
	int n; //输入行列数
	cin>>n;
	int i,j,k=1;
	int num=2*n-1;   //总共要执行的次数
	int time=1;       //当前要执行的次数
	int forward=0,down=0,back=0,up=0;   //执行时的方向及次数
	while(time<=num)
	{
		switch(time%4){
			case 1:        
				{
					for(i=forward;i<n-forward;i++)
						ans[forward][i]=k++;
					time++;
					forward++;
					break;
				}
			case 2:
				{
					for(i=1+down;i<n-down;i++)
						ans[i][n-1-down]=k++;
					time++;
					down++;
					break;
				}
			case 3:
				{
					for(i=n-2-back;i>-1+back;i--)
						ans[n-1-back][i]=k++;
					time++;
					back++;
					break;
				}
			case 0:
				{
					for(i=n-2-up;i>up;i--)
						ans[i][up]=k++;
					time++;
					up++;
					break;
				}
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			cout<<ans[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值