您的位置:首页 > 其它

蛇形填数

2016-03-14 21:15 183 查看
相信大家都知道蛇形填数。如下面的矩阵就是蛇形填数的结果:

10 11 12 1

9 16 13 2

8 15 14 3

7 6 5 4

代码如下:

#include<stdio.h>

#include<string.h>

#define manx 10

int a[manx][manx];

int main()

{

int n,x,y,t=0;

scanf("%d",&n);

memset(a,0,sizeof(a));

t=a[x=0][y=n-1]=1;

while(t<n*n)

{

while(x+1<n&&!a[x+1][y]) a[++x][y]=++t;

while(y-1>=0&&!a[x][y-1]) a[x][--y]=++t;

while(x-1>=0&&!a[x-1][y]) a[--x][y]=++t;

while(y+1<n&&!a[x][y+1]) a[x][++y]=++t;

}

for(x=0;x<n;x++)

{

for(y=0;y<n;y++)

printf("%3d",a[x][y]);

printf("\n");

}

return 0;

}

然而最近做题时发现了个另类的蛇形填数:

题目描述如下:

萌萌哒 孟孟学长 参加去年的训练的时候,蛇形矩阵那题被他分分钟秒掉,于是他决定出一个更难的题目,要求矩阵里的每个数都是质数,而且,蛇形的规则也有变化

如2*3矩阵:

2 13 11

3 5 7

再如3*4的矩阵

2 29 23 19

3 31 37 17

5 7 11 13


输入

第一行为一个正整数T,表示数据的组数,接下来T行,每行两个正整数n,m,表示矩阵有n行m列


输出

对于每一个输入输出n行,每行m个数,表示这个矩阵,输出内容见题目描述,每个数输出宽度为 7


样例输入

2
2 3
3 4


样例输出

2     13     11
3      5      7
2     29     23     19
3     31     37     17
5      7     11     13


提示

1<=n,m<=100

这个最主要的问题是怎么让素数依次排列

#include<stdio.h>

#include<string.h>

#include<math.h>

int b[100000];

int prime()

{

int i,j,count=0;

for(i=2;;i++)

{

int k=sqrt(i);

for(j=2;j<=k;j++)

{

if(i%j==0)

break;

}

if(j<=k)

continue;

b[count]=i;

count++;

if(count==10000)

break;

}

}

int main()

{

int a[100][100];

int m,n,x,y;

int T;

scanf("%d",&T);

prime();//相当于将调用的函数放在了主函数中

while(T--)

{

scanf("%d%d",&m,&n);

memset(a,0,sizeof(a));

int count=0;

a[x=0][y=0]=2; //这个蛇形填数首先填的是数组的第一个元素

while(count<m*n-1)

{

while(!a[x+1][y]&&x+1<m) a[++x][y]=b[++count];

while(!a[x][y+1]&&y+1<n) a[x][++y]=b[++count];

while(!a[x-1][y]&&x-1>=0) a[--x][y]=b[++count];

while(!a[x][y-1]&&y-1>=0) a[x][--y]=b[++count];

}

for(x=0;x<m;x++)

{

for(y=0;y<n;y++)

printf("%7d",a[x][y]);

printf("\n");

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: