队列排序
问题描述:
本关要求编写函数rotateLeft,该函数实现对一个 n × n 方阵中的每个元素循环向左移 m 个位置( 0 < m < n ),即将第 0 、 1 、…、 n - 1 列变换为第 n - m 、 n - m + 1 、…、 n - 1 、 0 、 1 、…、 n - m - 1 列。
提示:
存储 n × n 的方阵需要使用二维数组
我的解题思路:
用另一个数组b[]来储存数组a[]里n-1~0的值,然后把a[]的第一列提出来,其他列全部向左平移,再把第一列的值赋值到最后一列,用循环的思想,希望能帮到大家。
代码如下:
#include <iostream>
using namespace std;
// 函数rotateLeft:矩阵循环左移
// 参数:a-100*100的二维数组,用来存储n行n列的数组(n<100),存储在其~n-1行和~n-1列,
// m-循环左移的位数(0<m<n)
void rotateLeft(int a[][100], int n, int m);
int main()
{
// 定义存储二维数组的空间
int a[100][100];
int n, m;
// 输入n和m
cin >> n >> m;
// 输入n*n的矩阵,存储在数组a的~n-1行和~n-1列
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin >> a[i][j];
// 循环左移
// 说明:传递多维数组时,实在参数只需要给出数组名就可以了
rotateLeft(a, n, m);
// 输出循环左移的结果
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
cout << " " << a[i][j];
cout << endl;
}
return 0;
}
void rotateLeft(int a[][100], int n, int m)
{
// 请在此添加代码,实现函数rotateLeft
/********** Begin *********/
int l, h;
int b[100][100];
int g = 0;
while (g != m)//平移的次数
{
for (int i = 0; i < n; i++)
{
for (int j = n - 1; j >= 0; j--)
{
b[i][j] = a[i][j];
}//先用b[]存下来a[]的值,之后要用到
}
for (h = 0; h < n; h++)
{
for (l = n - 1; l >= 0; l--)
{
if (l - 1 >= 0)//不能越界
{
a[h][l - 1] = b[h][l];//向左平移一位
}
else
{
a[h][n - 1] = b[h][l];//第一列赋值到最后一列
}
}
}
g++;
}
/********** End **********/
}
如有建议还请各位指出,一起进步,希望我的代码能对各位有所帮助。