如何解决将矩阵旋转一个元素:是否有更简单/更简单的实现?
我写了这段代码来一个一个地旋转矩阵元素。 我想自己做这件事,但我被困在这个位置,有人请找出我的代码中的问题,并建议我除此之外还有其他简单的实现。
#include<iostream>
using namespace std;
void rotate(int a[][10],int r,int c)
{
int b[10][10];
// Copying the input matrix 2d array to temp array
for (int x = 0; x < r; x++)
{
for (int y = 0; y < c; y++)
{
b[x][y] = a[x][y];
}
}
//Rotation process
int i = 0;
int j = 0;
int flag = 0;
while (flag == 0)
{
if (i == 0 && j < c-1)
{
b[i][j+1] = a[i][j];
j++;
}
else if (j == c-1 && i < r-1)
{
b[i+1][j] = a[i][j];
i++;
}
else if (i == r-1 && j <= c-1 && j > 0)
{
b[i][j-1]=a[i][j];
j--;
}
else if (j == 0 && i <= r-1)
{
if (i==0 && j==0)
{
//to break the loop
flag = 1;
}
b[i-1][j] = a[i][j];
i--;
}
}
for (int k = 0; k < r; k++)
{
for (int l = 0; l < c; l++)
{
cout<<"\t"<<b[k][l];
}
cout<<endl;
}
}
int main()
{
int a[10][10],row,col;
cout<<"Enter no of rows : ";
cin>>row;
cout<<"Enter no of columns : ";
cin>>col;
// Getting array elements
cout<<"Enter "<<row<<"X"<<col<<" matrix elements : ";
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
cin>>a[i][j];
}
}
rotate(a,col);
cout<<endl;
system("pause");
return 0;
}
此代码不起作用。有人帮我找出这段代码有什么问题或建议我另一种方式。 谢谢。
解决方法
如果我要解决这个问题,我可能会使用 4 个独立循环和一个变量来保存要结转的值(可以从原始或矩阵副本中读取)。虽然可能比某些方法更重复,但它也不需要跟踪“哪个方向”状态或增量运动变量。
在伪代码中,它可能如下所示:
carry = m[0][0]
x,y = 1,0 # start at (1,0) so we end on (0,0)
# go right from (1,0) to (cols-1,0)
while x < cols:
temp = m[x][y] # hold value of this cell
m[x][y] = carry # replace it with the carried-over value
carry = temp # and forward the previous value as the next carry
x += 1 # update position
# reset back to valid index (avoid additional check in loop)
x -= 1
# do same for other directions around
# the movement is thus:
# (1,0) -> (cols-1,0) NW -> NE
# (cols-1,0) -> (cols-1,rows-1) NE -> SE
# (cols-1,rows-1) -> (0,rows-1) SE -> SW
# (0,rows-1) -> (0,0) SW -> NW
根据预期,1xN 或 Nx1 矩阵可能需要额外考虑。
另一种方法是使用delta变量来移动。想想一只小乌龟,它在走进墙壁时会直走并向右转。终止条件再次设置为 (0,0) 可以在逻辑结束时检查 - 在这种情况下,当海龟试图向北走到墙上时,我们知道它来自 (0,0) 并且路径完成。
这种方法感觉不那么重复,同时保持简单的状态转换。
carry = m[0][0]
x,0 # start at (1,0)
dx,dy = 1,0 # and facing East
while true:
# could also use prev_x and prev_y instead of a carry
temp = m[x][y]
m[x][y] = carry
carry = temp
# move / walk
x += dx
y += dy
# turn right when running into a wall
# at most one bound can be violated at a time
if x >= cols:
dx,dy = 0,1 # face South (was facing East)
x = cols - 1
else if y >= rows:
dx,dy = -1,0 # face West (was facing South)
y = rows - 1
else if x < 0:
dx,-1 # face North (was facing West)
x = 0
else if y < 0:
# at (0,0) walking North - finished!
break
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。