广州百田2015校园招聘笔试题

昨天参加了百田春招,笔试题3道大题。

一、给定两个正整数n行和m行,将数字0-n*m-1按顺时针方向旋转填入n*m的矩阵并输出

如n=4m=5时,输出

0     1     2     3     4

13   14  15  16   5

12   19  18  17   6

11   10   9    8     7

代码:

#include<iostream>
#include <iomanip>
using namespace std;
void Test(int n, int m);
void print(int **t, int n, int m);

void Test(int n, int m)
{
	int **t = new int*[n];
	int i = 0;
	for (i = 0; i < n; i++)
	{
		t[i] = new int[m];
		memset(t[i], 0, m*4);
	}

	int j ,sum1, sum2, d;
	sum1 = 0;

	for (i = 0; i < (n+1) / 2&&i<(m+1)/2; i++)
	{
		sum2 = sum1 + (m - 2 * i) * 2 + n - 2 - 2 * i;//sum1表示上半部分当行第一位值,sum2表示下半部分当行第一位值
		d = 0;
		for (j = 0; j < m - 2 * i; j++, d++)
		{
			t[i][j + i] = sum1 + d;
			if (i != n/2)							//若n为奇数则下半部分要比上半部分少一行
				t[n - i - 1][j + i] = sum2 - d -1;
		}
		sum1 += (n - i*2 + m - i*2 - 2) * 2;	//sum1 += (n - 1 + m - 1) * 2;
	}

	sum1 = m;
	for (i = 0; i < (n+1) / 2&&i<(m+1) / 2; i++)
	{
		sum2 = sum1 + (n - 2 - 2 * i) * 2 + m - 2 * i;//sum1表示右半部分当行第一位值,sum2表示左半部分当行第一位值
		d = 0;
		for (j = 1; j < n - 2 * i-1; j++, d++)
		{
			t[j+i][m-1-i] = sum1 + d;
			if (i != m / 2)							//若m为奇数则左半部分要比右半部分少一行
				t[j+i][i] = sum2 - d -1 ;
		}
		sum1 += (n - i * 2 + m - i * 2 - 3) * 2;	//		sum1 += (n - 2 + m - 1) * 2;
	}

	print(t, n, m);

	for (i = 0; i < n; i++)
	{
		delete[] t[i];
	}

}

void print(int **t, int n, int m)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
			cout << setw(6)<<t[i][j];
		cout << endl;
	}
}
 
int main()
{
	int n = 7;
	int m = 11;
	Test(n, m);

	return 0;
}
注:代码是昨天晚上写的,今天再来看时在n或m为奇数时输出中有一行有问题,进行了修改。不知是否还有别的情况没有考虑!

n=7 m=11














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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值