我所遇到的第一种便是code vs上的 1160蛇形矩阵
题目描述的矩阵:
在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
首先看到题就该思考,我从中心开始逆时针方向绕行递增,那么中心的位置不好找,我们可以从临界值入手。也就是最大值,从最后一个值一直模拟,直到数字为1为止。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int mp[120][120];
int main()
{
int n;
scanf("%d",&n);
int i = n*n;
int x = n - 1,y = n - 1;
mp[x][y] = i--;
while(i)
{
while(y - 1 >= 0 && !mp[x][y - 1]) mp[x][--y] = i--;
while(x - 1 >= 0 && !mp[x - 1][y]) mp[--x][y] = i--;
while(y + 1 < n && !mp[x][y + 1]) mp[x][++y] = i--;
while(x + 1 < n && !mp[x + 1][y]) mp[++x][y] = i--;
}
for(int i = 0;i < n;++i)
{
for(int j = 0;j < n;++j)
printf("%d ",mp[i][j]);//如果觉得数字不规整可以加上%xd作为输出格式
printf("\n");
}
printf("%d\n",num);
return 0;
}
输入
3
输出
7 8 1
6 9 2
5 4 3
第二种蛇形矩阵,出自《算法竞赛入门经典(第二版)》 第三章蛇形填数
题目描述:在1,2,...,n*n,要求填成蛇形。例如,n = 4时的方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
这个题目和一开始的题目很相似,也就是说我们可以先从边界值入手,这里可以从1开始,遵循下,...,左...,上,...,右,...的规则,直到输出n*n为止。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int mp2[102][102];
int main()
{
int n;
scanf("%d",&n);
int x = 0,y = n - 1;
int t = 1;
mp2[x][y] = 1;
while(t < n*n)
{
while(x + 1 < n && !mp2[x + 1][y]) mp2[++x][y] = ++t;
while(y - 1 >= 0&& !mp2[x][y - 1]) mp2[x][--y] = ++t;
while(x - 1 >= 0 && !mp2[x - 1][y]) mp2[--x][y] = ++t;
while(y + 1 < n && !mp2[x][y + 1]) mp2[x][++y] = ++t;
}
for(int i = 0;i < n;++i)
{
for(int j = 0;j < n;++j)
printf("%2d ",mp2[i][j]);//题目样例中,数字已对齐。
printf("\n");
}
return 0;
}
输入
3
输出
7 8 1
6 9 2
5 4 3
个人感觉无论遇到怎么样的蛇形矩阵,只要找到一个边界点,并且按照题目的要求,把数字模拟运行出来即可。
关于模拟算法,我个人理解就是照着葫芦画瓢,至于这个瓢怎么画,更多的还是看个人的理解。
END