没什么东西,就是麻烦,容易出错,对于每个点找其旋转后的位置,然后一个一个替换,一层套一层的。
// LeetCode_RotateImage.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
void getlastij(int leftup,int rightdown,int i,int j,int &lasti,int &lastj)
{//length is rightdown - leftup + 1
lasti = i;
lastj = j;
int sum = rightdown - leftup;
if (i==leftup)
{
while(sum>0&&lastj>=leftup&&lastj<=rightdown)
{
sum--;
lastj--;
}
if (sum>0||(sum==0&&lastj<leftup))
{
lastj++;
sum++;
while(sum>0&&lasti>=leftup&&lasti<=rightdown)
{
sum--;
lasti++;
}
}
return ;
}
if (i==rightdown)
{
while(sum>0&&lastj>=leftup&&lastj<=rightdown)
{
sum--;
lastj++;
}
if (sum>0||(sum==0&&lastj>rightdown))
{
lastj--;
sum++;
while(sum>0&&lasti>=leftup&&lasti<=rightdown)
{
sum--;
lasti--;
}
}
return ;
}
if (j==leftup)
{
while(sum>0&&lasti>=leftup&&lasti<=rightdown)
{
sum--;
lasti++;
}
if (sum>0||(sum==0&&lasti>rightdown))
{
lasti--;
sum++;
while(sum>0&&lastj>=leftup&&lastj<=rightdown)
{
sum--;
lastj++;
}
}
return ;
}
if (j==rightdown)
{
while(sum>0&&lasti>=leftup&&lasti<=rightdown)
{
sum--;
lasti--;
}
if (sum>0||(sum==0&&lasti<leftup))
{
lasti++;
sum++;
while(sum>0&&lastj>=leftup&&lastj<=rightdown)
{
sum--;
lastj--;
}
}
return ;
}
}
void rotate(vector<vector<int> > &matrix) {
int n = matrix.size();
for (int step = n,leftup=0;step>1;step-=2,leftup++)
{
int rightdown = leftup + step-1;
for (int i=leftup;i<rightdown;i++)
{
int lasti,lastj;
int curi = leftup,curj = i;
int temp = matrix[curi][curj];
for (int k=1;k<=3;k++)
{
getlastij(leftup,rightdown,curi,curj,lasti,lastj);
matrix[curi][curj] = matrix[lasti][lastj];
curi = lasti;
curj = lastj;
}
matrix[curi][curj] = temp;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<vector<int> > matrix;
vector<int> onevalue;
int n;
while(cin>>n)
{
matrix.clear();
for (int i=0;i<n*n;i+=n)
{
onevalue.clear();
for (int j=1;j<=n;j++)
{
onevalue.push_back(i+j);
}
matrix.push_back(onevalue);
}
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
rotate(matrix);
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
}
system("pause");
return 0;
}

本文介绍了一个解决LeetCode上旋转图像问题的C++实现方法。通过定义一个旋转矩阵的函数,实现了矩阵的顺时针90度旋转。该算法通过逐层处理矩阵的边界来减少重复计算,并详细展示了如何确定旋转后元素的位置。
525

被折叠的 条评论
为什么被折叠?



