回型矩陣的C++實現
這個問題還是前一陣子面試的時候遇到的,就是給你一個數字N,建立一個N×N的矩陣,元素有外層向內層遞增,也就是:
1 2 3
8 9 4
7 6 5
這樣的矩陣;當時做了一個多小時也沒有弄出來,其實本來是一個很簡單的東西,可能當時實在是腦子有些累了,因為面試要做一些筆試,還得應付考官的問題,實在是沒有精力再去考慮那個演算法,後來回來後我從網上也沒有看到很好的演算法,沒辦法,就自己憋吧,其實核心演算法並不麻煩,僅僅是設定幾個關鍵位置的標誌,主要是思路清晰點就好了,後來我也沒做出來,就放到那裡了,昨天晚上突然心血來潮,決定把他搞出來,終於,搞定了,於是拿出來跟大家分享下,大家有什麼好的演算法也可要不吝賜教。。。。
#include<iostream>
using namespace std;
bool CreateMetrix(int *pMetrix,int n)
{
int i = 0, //資料元素
j = 0, //列號
k = 0;//行號
int iUp = 0,//上邊界
iDown = n,//下邊界
iLeft = 0,//左邊界
iRight = n;//右邊界
bool bRight = true,//左右填充方向
bDown = true;//上下填充方向
if (NULL == pMetrix)
{
return false;
}
memset(pMetrix,0,sizeof(int) * n*n);
//開始填充
for (i = 1; i <= n*n; i++)
{
//首先向右填充
if (bRight)
{
if (j < iRight)//還沒有到達右邊界
{
*(pMetrix + n * k + j) = i;
j++;
}
else
{
k++;//列號不變,增加行號,因為上面已經填充了對應行的列元素,故先將行號增加
if (k < iDown)//還沒有到最底端
{
*(pMetrix + n * k + (j - 1)) = i;//此處的j是目前列號加1,因為上面的判斷條件所致
}
else
{
iRight--;//右邊界列號減1
iDown--;//下邊界行號減1
k--;//行號減1
j--;//列號減1
bRight = false;//已經走完一個折線,接下來是向左填充了
}
}
}
if (!bRight)//向左填充
{
if (j > iLeft)//如果還沒有到達左邊界
{
j--;//在前面已經把第k行第j列元素填充了
*(pMetrix + n * k + j) = i;
}
else
{
k--;//第k行元素已經填充
if (k > iUp)//還沒有到達最頂部
{
*(pMetrix + n * k + j) = i;
}
else
{
iLeft++;//左邊界加1
iUp++;//上邊界加1
k++;//k已經減過頭了
j++;//j也見過頭了
i--;//這時候這個資料沒有被填充,所以回退一個
bRight = true;//下面又要向右填充了
}
}
}
}
return true;
}
void OutPutMetrix(int *Src, int n)
{
int t = 0;
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < n; j++)
{
t = *(Src + n*i + j);
cout << "/t" << t;
}
cout << endl;
}
}
int main()
{
int *p = NULL;
int n = 2;
cout <<"輸入矩陣的維度:" << endl;
cin >> n;
if (n > 0)
{
p = new int[n*n];
}else
{
cout << "輸入數字有誤!/n本程式不能處理,再見!" << endl;
return 0;
}
if (CreateMetrix(p,n))
{
OutPutMetrix(p, n);
}
else
{
cout << "處理中出現錯誤,很抱歉。。。" << endl;
}
delete p;
return 1;
}
函式直接就可以用,只要傳遞一個矩陣的指標和維度就ok了