3617 - 数字正方形

通过次数

0

提交次数

0

时间限制 : 0 秒 内存限制 : 128 MB

现给定一个数N,用1N^2这些数做一个N*N的数字正方形,正方形规律如下:

N=5时输出正方形:

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

题目输入

测试包含多组测试数据,每组测试数据包含一行,

每行输入一个整数N1<=N<=10;

题目输出

对于每组测试数据输出如上规则的数字正方形

输入/输出样例

输入格式

1
3

输出格式

1
1 2 3
8 9 4
7 6 5

C语言解答


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

C++解答

#include <bits/stdc++.h>
using namespace std;
int a[15][15];
int n;

void change()
{
	int ff=0;
	int data=1;
	int i=1,j=1;
	
	while(data<=n*n){
		
		a[i][j]=data++;
		
		
		if (ff==0){
			j++;
			if (a[i][j]!=0){
				i++;
				j--;
				ff=1;
			}
			continue;
		}
		
		if (ff==1){
			
			i++;
			if (a[i][j]!=0) {
				j--;
				i--;
				ff=2;
			}
			continue;
		}
		
		if (ff==2){
			
			j--;
			if (a[i][j]!=0){
				i--;
				j++;
				ff=3;
			} 
			
			continue;
			
		}
		
		
		if (ff==3){
			i--;
			if (a[i][j]!=0){
				j++;
				i++;
				ff=0;
			}
		
			
			continue;
		}
		
	}
	
	
}

void init()
{
	memset(a,0,sizeof(a));
	for (int i=0;i<=n+1;i++){
		a[0][i]=a[i][0]=a[n+1][i]=a[i][n+1]=-1;
	}
}


void print()
{
	for (int i=1;i<=n;i++){
		for (int s=1;s<=n;s++){
			if (s>1) printf(" ");
			printf("%d",a[i][s]);
		}
		printf("\n");
	}
}

int main()
{
	
	while(~scanf("%d",&n)){
		
		init();
		
		change();
		
		print();
		
	}
	return 0;
}

Java解答

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		boolean flag = true;
		int n;
		while (scan.hasNextInt()) {
			n = scan.nextInt();
			int[][] arrs = new int[n][n];
			int a;
			int b;
			int c = 0;
			int z = n * n;// 矩阵最大数字
			int ou = 1;// 当前数字
			while (ou <= z) {
				a = 0;
				b = 0;
				for (a = a + c, b = b + c; b < n - c; b++) {// 从左到右
					if (ou > z) {
						break;
					} else {
						arrs[a][b] = ou++;
					}
				}

				for (b--, a++; a < n - c; a++) {// 从上到下
					if (ou > z) {
						break;
					} else {
						arrs[a][b] = ou++;
					}
				}

				for (b--, a--; b >= c; b--) {// 从右到左
					if (ou > z) {
						break;
					} else {
						arrs[a][b] = ou++;
					}
				}

				for (a--, b++; a >= c + 1; a--) {// 从下到上
					if (ou > z) {
						break;
					} else {
						arrs[a][b] = ou++;
					}
				}
				c++;// 圈数
			}

			int i, j;
			for (i = 0; i < n; i++) {
				for (j = 0; j < n; j++)
					System.out.print(arrs[i][j] + " ");

				System.out.println();
			}
		}
      
       
	}

}