算法-蛇型矩阵

蛇形方陈

描述

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<=100)

输出

输出结果是蛇形方陈。

样例输入

3

样例输出

7 8 1

6 9 2

5 4 3

//自己写的  太差了, 开始努力吧

时间

内存

语言

窗体顶端

104

1660

java

Accepted

import java.util.Scanner;

public class shexingjuzhen {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

if(n>0){

int[][] zpy = new int[n][n];

//set  0 of the whole array

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

zpy[i][j] = 0;

}

}

//set number of the northeast to centre diagonal line 

zpy[0][n-1] = 1;

int m = n-1;

int h = n-1;

for (int i = 1; i < n / 2 + n % 2; i++,m--) {

zpy[i][m - 1] = zpy[i-1][m] + 4 * h ;

h=h-2;

}

//set number of the southeast to centre diagonal line

zpy[n-1][n-1] = n;

m=n-1;

h=n-2;

for (int i = n-1 ; i >n / 2 + n % 2; i--,m--) {

zpy[i-1][m - 1] = zpy[i][m] + 4 * h + 2 ;

h=h-2;

}

//set number of the southwest to centre diagonal line

zpy[n-1][0] = 2*n-1;

m = 0;

h = n-2;

for (int i = n-1 ; i >n / 2 + n % 2; i--,m++) {

zpy[i-1][m + 1] = zpy[i][m] + 4 * h ;

h=h-2;

}

//set number of the northwest to centre diagonal line

zpy[0][0] = 3*n-2;

m = 0;

h=n-3;

for (int i = 1; i < n / 2 + n % 2; i++,m++) {

zpy[i][m+1] = zpy[i-1][m] + 4 * h + 2 ;

h=h-2;

}

// filling the array

        //fill west

for(int i = 0;i<n/2+n%2;i++){

if(zpy[i][i] == zpy[n-i-1][i] +n-1-2*i  ){

int mid =zpy[i][i]-1;

for(int j=i+1;j<n-1-i;j++){

zpy[j][i] = mid-- ;

}

}

}

//fill east

int t= 0;

for(int i = n-1;i>=n/2+n%2;i--){

if( zpy[i][i] == zpy[n-i-1][i] +i-t){

int mid = zpy[i][i]-1;

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

zpy[j][i] = mid--;

}

t++;

}

}

//fill north

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

for(int j=i;j<n-i-2;j++){

zpy[i][j+1] = zpy[i][j]+1;

}

}

//fill south

for(int i=n-1,p=1;i>n/2;i--,p++){

for(int j=p;j<n-p;j++){

zpy[i][j] = zpy[i][j-1] - 1;

}

}

// print the array

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

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

}

System.out.println();

}

}else{

}

}

}

 

以下是比较强的算法

 

 

 

 

 

蛇形填数

Accepted

0

228

C/C++

11-14 17:29:31

 

//下左上右循环, 利用遇到不为0的数变换方向来填数。

#include"stdio.h"
int main()
{
int a[109][109]={0},i,j,k,n,m,top,x,y;
top=1;
scanf("%d",&n);
a[x=0][y=n-1]=1;
while(top<n*n)
{
while(x+1<n&&!a[x+1][y]) a[++x][y]=++top;
while(y-1>=0&&!a[x][y-1]) a[x][--y]=++top;
while(x-1>=0&&!a[x-1][y]) a[--x][y]=++top;
while(y+1<n&&!a[x][y+1]) a[x][++y]=++top;

}

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)

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

蛇形填数

Accepted

0

228

C/C++

11-14 17:32:41

利用每圈起始点相同遍历,循环圈数

#include<stdio.h>
int main()
{
int n,i,j,a[100][100],m,k=1;
    scanf("%d",&n);
    m=n;
for(i=0;i<(n+1)/2;i++)
    {
for(j=i;j<m;j++)
            a[j][m-1]=k++;
for(j=m-2;j>=i;j--)
a[m-1][j]=k++;
for(j=m-2;j>=i;j--)
a[j][i]=k++;
for(j=i+1;j<m-1;j++)
            a[i][j]=k++;
        m-=1;
    }
for(i=0;i<n;i++)
    {
for(j=0;j<n;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值