《Cracking the Coding Interview程式設計師面試金典》----畫素翻轉

塵封的記憶0發表於2017-04-19
時間限制:3秒 空間限制:32768K 熱度指數:3726
本題知識點: 程式設計基礎 陣列
 演算法知識視訊講解

題目描述

有一副由NxN矩陣表示的影象,這裡每個畫素用一個int表示,請編寫一個演算法,在不佔用額外記憶體空間的情況下(即不使用快取矩陣),將影象順時針旋轉90度。

給定一個NxN的矩陣,和矩陣的階數N,請返回旋轉後的NxN矩陣,保證N小於等於500,影象元素小於等於256。

測試樣例:
[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]

解題思路:這種型別的,最好的方法是自己畫一個圖,,然後從圖中找出相應位置的變化規律。
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
	for (int i = 0; i<n; i++)
	{
		for (int j = 0; j<n - i; ++j)
			swap(mat[i][j],
			mat[n - 1 - j][n - 1 - i]);
	}
	for (int i = 0; i<n / 2; ++i)
		swap(mat[i], mat[n - 1 - i]);
	return mat;
}
void printVector(vector<vector<int> > mat,int n)
{
     for(int i = 0; i < n; i++)
    {
        for(int j = 0;j < n; j++)
        {
            cout << mat[i][j] << " ";
        }
        cout << endl;
    }
}
int main()
{
	vector<vector<int> > n;
	vector<int> v;
	int m;
	int temp;
	while (cin >> m)
	{
		for (int i = 0; i<m; i++)
		{
			v.clear();
			for (int j = 0; j < m; j++)
			{
				cin >> temp;
				v.push_back(temp);
			}
			n.push_back(v);
		}
		printVector(transformImage(n, m),m);
	}
	return 0;
}

不懂的可以加我的QQ群:261035036(IT程式設計師面試寶典

群) 歡迎你到來哦,看了博文給點腳印唄,謝謝啦~~


下面這個是用過載的方式寫的:

#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
vector<vector<int> > transformImage(vector<vector<int> >& mat, int n) {
	for (int i = 0; i<n; i++)
	{
		for (int j = 0; j<n - i; ++j)
			swap(mat[i][j],
			mat[n - 1 - j][n - 1 - i]);
	}
	for (int i = 0; i<n / 2; ++i)
		swap(mat[i], mat[n - 1 - i]);
	return mat;
}
ostream & operator<<(ostream &out, vector<vector<int> > &A) {
	for (int i = 0; i<A.size(); i++)
	{
		for (int j = 0; j<A.at(i).size(); j++)
		{
			out << A.at(i).at(j) << " ";
		}
		out << endl;
	}
	return out;
}
int main()
{
	vector<vector<int> > n;
	vector<int> v;
	int m;
	int temp;
	while (cin >> m)
	{
		for (int i = 0; i<m; i++)
		{
			v.clear();
			for (int j = 0; j < m; j++)
			{
				cin >> temp;
				v.push_back(temp);
			}
			n.push_back(v);
		}
		//printVector(transformImage(n, m),m);
		transformImage(n, m);
		cout << n << endl;

	}
	return 0;
}


相關文章