昨天参加了百田春招,笔试题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