1. 程式人生 > >回型矩陣的C++實現

回型矩陣的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了