c - 将给定矩阵旋转 K 次
问题描述
按K
时间旋转矩阵意味着将给定N*N
矩阵的列向右移动K
位置。
例如,考虑一个3*3
必须旋转的矩阵。
输入:
n = 3;
k = 2;
旋转前的矩阵:
10 20 30
40 50 60
70 80 90
预期输出:
20 30 10
50 60 40
80 90 70
实际输出:
Segmentation fault (core dumped)
我不知道哪里弄错了。请整理一下。:(
以下是我的尝试。
#include <stdio.h>
int main()
{
int n,i,j,k,temp=0;
scanf("%d",&n);
int arr[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&arr[i][j]);
}
}
scanf("%d",&k);
for(int l=1;l<=k;l++){
temp=arr[i][0];
for(int i=0;i<n;i++){
for(int j=1;j<n-1;j++){
arr[i][j]=arr[i][j+1];
}
}
arr[i][j]=temp;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d",arr[i][j]);
}
}
return 0;
}
解决方案
解决方案
#include <stdio.h>
int main ()
{
int n = 0, k = 0;
while(n > 100 || n <= 0)//to prevent absurd values. Adjust as required
{
printf ("Enter length of matrix: ");
scanf ("%d", &n);
}
printf ("Enter shift times: ");
scanf ("%d", &k);
k = k % n;//get rid of excess shifts
k = n - k;//convert shift direction (right to left)
int arr[n][n];
printf ("Enter elements of matrix:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf ("%d", &arr[i][j]);//populates the matrix
}
}
int temp[n][k];//for storing part of matrix while swapping
for (int i = 0; i < n; i++)
{
for (int j = 0; j < k; j++)
{
temp[i][j] = arr[i][j];//stores part of matrix
}
}
for (int i = 0; i < n; i++)
{
for (int j = k; j < n; j++)
{
arr[i][j - k] = arr[i][j];//moves remaining part of matrix
}
}
for (int i = 0; i < n; i++)
{
for (int j = n - k; j < n; j++)
{
arr[i][j] = temp[i][j - (n - k)];//places stored part in position
}
}
printf ("The matrix:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf ("%d\t", arr[i][j]);//prints the matrix
}
printf("\n");
}
return 0;
}
说明
你有没有想过如果 的值k
大于会发生什么i
?
该行k = k % n
处理它。它将右移次数更改为所需的最小右移次数。
该行将k = n - k
右移次数更改为等量的左移次数。k
这是必需的,因为我们的代码将矩阵按列左移。
为什么?因为我想让它这样做。
请注意,语句后面的代码int temp[n][k];
与我们编写的使用第三个交换两个变量的代码非常相似。
temp = a;
a = b;
b = temp;
最后,我们打印我们的矩阵。
笔记:
该程序的编写方式易于阅读和理解。它尚未针对性能进行优化。
推荐阅读
- python - 使用 XlsxWriter 将单元格中的文本定向到垂直?
- jquery - 带有承诺的 Jquery Ajax 调用
- javascript - 在页面重新加载时根据屏幕宽度切换菜单的可见性
- android - 如何从活动 3 过渡到活动 1?
- php - 如何将函数数据传递给刀片视图
- trace32 - Trace32:设置在 data.dump 上显示的行数的方法
- powershell - PowerShell 脚本无法在远程服务器上执行批处理文件
- git - Gitlab + Ansible 部署/管理多个集群
- excel - 在不同文件中拆分 Excel 工作表并将特定列中的数据复制到新文件中
- android - FLutter - 尝试运行应用程序时出错