`
guancloud911012
  • 浏览: 16360 次
社区版块
存档分类
最新评论

第6题-【规律方阵】

 
阅读更多

/*
6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:

① 倒填,例如N=5 ② 蛇形填数 ③ 回转填数

┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐
│25│24│23│22│21│ │ 1│ 3│ 4│10│11│ │ 1│16│15│14│13│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│20│19│18│17│16│ │ 2│ 5│ 9│12│19│ │ 2│17│24│23│12│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│15│14│13│12│11│ │ 6│ 8│13│18│20│ │ 3│18│25│22│11│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│10│ 9│ 8│ 7│ 6│ │ 7│14│17│21│24│ │ 4│19│20│21│10│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│ 5│ 4│ 3│ 2│ 1│ │15│16│22│23│25│ │ 5│ 6│ 7│ 8│ 9│
└─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘
*/

#include "iostream"
using namespace std;

#define MAX_SIZE 81 + 1

void reMetrix(const int n)
{
int count = n*n;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
printf("%3d", count--);
}
cout << endl;
}
cout << endl;
}

void skMetrix(const int n)
{
int i, j;
int skMx[MAX_SIZE][MAX_SIZE];
skMx[0][0] = 1;
int r=0, c=0;
int count = 2;
for(i=0; i<n*2-2; i++)
{
int isRev = i<n-1 ? 0 : 1; // 是否过中界
isRev^(i%2==0) ? r++ : c++;
skMx[r][c] = count++;

for(j=0; j<(isRev ? n*2-i-3 : i+1); j++)
{
if(i%2 == 0)
{
c++;
r--;
}
else
{
r++;
c--;
}
skMx[r][c] = count++;
}
}

for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%3d", skMx[i][j]);
}
cout << endl;
}
cout << endl;
}

void spMetrix(const int n)
{
int i, j, k;
int count = 1;
int spMx[MAX_SIZE][MAX_SIZE];
int r=0, c=0;
for(i=0; i<n/2+1; i++)
{
if(n-1-2*i == 0)
{
spMx[r][c] = count;
break;
}
for(k=0; k<4; k++)
{
for(j=0; j<n-1-2*i; j++)
{
spMx[r][c] = count++;
switch(k)
{
case 0: r++; break;
case 1: c++; break;
case 2: r--; break;
case 3: c--; break;
}
}
if(k == 3)
{
c++;
r++;
}
}
}

for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%3d", spMx[i][j]);
}
cout << endl;
}
}

int main()
{
int n;
cin >> n;
cout << "① 倒填" << endl;
reMetrix(n);
cout << "② 蛇形填数" << endl;
skMetrix(n);
cout << "③ 回转填数" << endl;
spMetrix(n);

return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics