在java中 打印蛇形数_南阳理工 第33题 蛇形填数

题目描述:

打印出如下格式的数据:

a4c26d1e5885305701be709a3d33442f.png

解题思路:

如果我们将矩阵变一下形状,如下:

a4c26d1e5885305701be709a3d33442f.png

这样就变成输出一个三角阵了,简单多了。只是呢,需要在某些行上做一些逆序变换。

奇数 时变换奇数行; 偶数时变换偶数行。

最后按照斜线将数填入原来矩阵中,OK!

C程序如下:

#include

int main()

{

int n;

//输入输出矩阵的大小,不超过100,当然自己可以修改上限值。

printf("Input a num:");

scanf("%d",&n);

int a[100][100]={0};

int b[200][100]={0};

int num=0;

//构造三角阵数形

for(int i=0;i

{

for(int j=0;j<=i;j++)

{

num++;

b[i][j]=num;

}

}

for(i=n-1;i<2*n-1;i++)

{

for(int j=0;j<2*n-1-i;j++)

{

num++;

b[i][j]=num;

}

}

//某些行数据逆序

for(i=0;i

{

int temp=0;

for(int j=0;j<=i/2;j++)

{

temp=b[i][j];

b[i][j]=b[i][i-j];

b[i][i-j]=temp;

}

}

for(i=(n+1)/2*2;i<2*n-1;i+=2)

{

int temp=0;

for(int j=0;j

{

temp=b[i][j];

b[i][j]=b[i][2*n-2-i-j];

b[i][2*n-2-i-j]=temp;

}

}

//按照斜线将数填回原矩阵

for(i=0;i

{

for(int j=0;j<=i;j++)

{

a[i-j][j]=b[i][j];

}

}

for(i=n;i<2*n-1;i++)

{

for(int j=i-n+1;j

{

a[i-j][j]=b[i][j-i+n-1];

}

}

//输出矩阵

for(i=0;i

{

for(int j=0;j

printf("%d ",a[i][j]);

printf("\n");

}

return 0;

}

网络代码(2):

在n*n方阵里填入1,2,…,n*n,要求填成蛇形。例如n=4时方阵为:

10 11 12 1

9 16 13 2

8 15 14 3

7 6 5 4

输入

n(n<=8)

输出

蛇形方阵,要求打印每个数前加一个空格

样例输入

4

有核心代码 如下:

{while(i+1

while(i-1>=0&&!a[i][j-1])a[i][--j]=++tot;

while(i-1>=0&&!a[i-1][j])a[--i][j]=++tot;

while(j+1

其实可以直接赋值为{0}这样每个元素的初值也能全部写为0.。。。

#include

//因为最先竖着赋值,而核心代码里面最初的i在变,所以i代表行。。

int main()

{int a[20][20]={0};//赋初值使每元素的初值都为0,以便判断在赋值时判断下一位是否赋过值。。

int i,j,n,tot=0;

scanf("%d",&n);

i=-1,j=n-1;//使要赋的值时a[++i][j]的位置指向右上角。。。

while(tot

{ while(i+10;

a[++i][j]=++tot; //或者出界时停止竖着赋值。。即跳出这个循环。

while(j-1>=0&&!a[i][j-1])//开始倒退着赋值。。//不过感觉这里应该是j-1>=0才对

a[i][--j]=++tot;

while(i-1>=0&&!a[i-1][j])

a[--i][j]=++tot;

while(j+1

a[i][++j]=++tot;

}

for(i=0;i

{for(j=0;j

{printf("%d ",a[i][j]);}

printf("\n");

}

return 0;

}

网络代码(3):

#include

#define N 5 //1<=N<=20

int main()

{

int a[N][N]={0};

int i,j,iStep,jStep,n=1;

for(i=N-1;i>=0;--i) //倒填

for(j=N-1;j>=0;--j)

a[i][j]=n++;

puts("倒填:");

for(i=0;i

for(j=0;j

printf("%-3d%c",a[i][j],j==N-1?'\n':' ');

for(n=1,i=0,j=0,iStep=1,jStep=-1;n!=N*N+1;) //蛇形填数

{

for(

;i>=0&&i<=N-1&&j>=0&&j<=N-1;

)

{

a[i][j]=n++;

i+=iStep;

j+=jStep;

}

if(j<0||i>N-1)

{

if(i<=N-1)

++j;

else

{

--i;

j+=2;

}

iStep=-1;

jStep=1;

}

if(i<0||j>N-1)

{

if(i<0&&j<=N-1)

++i;

else

{

--j;

i+=2;

}

iStep=1;

jStep=-1;

}

}

puts("\n蛇形填数:");

for(i=0;i

for(j=0;j

printf("%-3d%c",a[i][j],j==N-1?'\n':' ');

for(i=0;i

for(j=0;j

a[i][j]=0;

for(n=1,i=0,j=0,iStep=1,jStep=0; n!=N*N+1;

) {

for(

;i>=0&&i<=N-1&&j>=0&&j<=N-1&&a[i][j]==0;

)

{

a[i][j]=n++;

i+=iStep;

j+=jStep;

}

i-=iStep; //返回多走的那一步

j-=jStep;

if(i>(N-1)/2&&j<=(N-1)/2)

//四个if 根据所处的四个角确定下一轮的走法

{

++j;

iStep=0;

jStep=1;

}

else

if(i>(N-1)/2&&j>(N-1)/2)

{

--i;

iStep=-1;

jStep=0;

}

else

if(i(N-1)/2)

{

--j;

iStep=0;

jStep=-1;

}

else

if(i

{

++i;

iStep=1;

jStep=0;

}

}

puts("\n回转填数:");

for(i=0;i

for(j=0;j

printf("%-3d%c",a[i][j],j==N-1?'\n':' ');

system("pause");

return 0;

}

蛇形,倒填,回转数输出

2011-07-01 8:28

package com.juzhen;

import java.util.Scanner;

public class Test1 {

static int[][] array;//储存数组

public static int get(){

System.out.println("请输入数组边长大小(n>=1)");

Scanner scan=new Scanner(System.in);

int m=scan.nextInt();

return m;

}

//倒填

public static void oper(int n){

array=new int[n][n];

int t=1;

for(int i=n-1;i>=0;i--){

for(int j=n-1;j>=0;j--){

array[i][j] = t++;

}

}

}

//蛇形填数

public static void oper2(int n){

array=new int[n][n];

int t=1;

int start=0,end=0;

for(int i=0;i<2*n-1;i++){

start = (i < n)?0: i-(n-1);

end = (i < n)? i :(n-1);

for(int j=start;j<=end;j++){

if(i%2!=0){

array[i-j][j] = t++;

}else{

array[j][i-j] = t++;

}

}

}

}

//回转数

public static void oper3(int n){

array=new int[n][n];

int t=1;

int p=(n%2==0)?(n/2):(n/2+1);

for(int i=0;i

for(int j=i;j

array[j][i] = t++;

}

for(int k=i;k

array[n-i-1][k] = t++;

}

for(int m=n-i-1;m > i;m--){

array[m][n-i-1] = t++;

}

for(int s=n-i-1;s > i;s--){

array[i][s] = t++;

}

}

if(n%2 != 0){

array[(n/2)][(n/2)]=n*n;

}

}

public static void print(int[][] array){

int n=array.length;

for(int i=0;i

for(int j=0;j

System.out.print(array[i][j]+" ");

}

System.out.println();

}

System.out.println("==============================================");

}

public static void main(String[] args) {

int i=get();

oper(i);

System.out.println("倒填");

print(array);

oper2(i);

System.out.println("蛇形");

print(array);

oper3(i);

System.out.println("回转");

print(array);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值