A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张周飞 金牌黑马   /  2014-6-15 00:15  /  1356 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看看大家有没有能写的,我现在没有思路
构造一个n阶方阵,方阵的大小从键盘输入,方阵的最外一圈元素为1,以后往内依次为2,3,....n。 例如:
   1   1   1   1   1
   1   2   2   2   1
   1   2   3   2   1
   1   2   2   2   1
   1   1   1   1   1

7 个回复

倒序浏览
江祖贇 来自手机 中级黑马 2014-6-15 00:19:25
沙发
很久很久以前c语言也有编写过这题
回复 使用道具 举报
import java.util.*;
public class Demo1 {
        public static void main(String[] args) {
               
                System.out.print("请输入:len=");
               
                Scanner scan = new Scanner(System.in);
               
                //下面从1开始,为了使维数统一,这个地方要+1
                int len = scan.nextInt()+1;
               
                for(int i=1; i<len; i++)
                {
                        for(int j=1; j<len; j++)
                        {
                                //矩阵中从上向下,从左到右,从下到上,从下到上的最小值即是该位置的值
                                System.out.print( min(min(i, len-i), min(j, len-j)));
                        }
                        System.out.println();
                }

        }

        public static int min(int i, int j)
        {
                return i<j?i:j;
        }
}


回复 使用道具 举报
本帖最后由 黎志勇 于 2014-6-15 02:05 编辑

首先建坐标系,如图所示

会发现,各个数据会以红线为轴对称,
为什么我要选这个对角线,而不选其他方向的,因为这个线左上角的数字的坐标都比n/2小,取值时会方便很多。
其中我选了一对对称的数,其坐标分别是(1,0)(4,3)
可以很容易得到这个轴对称的数满足a(i,j)=a(n-j-1,n-i-1)的规律,
下面只要找各项如何赋值就行,因为我是针对左上角的数进行操作的,很容易会发现,i和j坐标比较小的那个加上1,就等于该项的值。
下面就可以编写代码了。
  1. import java.util.Scanner;

  2. public class Demo {
  3.         
  4.         public static void main(String[] args) {
  5.                 // TODO Auto-generated method stub
  6.                 Scanner scanner = new Scanner(System.in);
  7.                 int n = scanner.nextInt();// 输入项数n
  8.                 int[][] array = new int[n][n];// 构建阵列数组
  9.                 int i, j;
  10.                 for (i = 0; i < n; i++) {
  11.                         for (j = 0; j < n - i; j++) {// 注意这里j<n-i
  12.                                 array[i][j] = (i < j ? i : j) + 1;// 该项数值为较小坐标的数值加1
  13.                                 array[n - j - 1][n - i - 1] = array[i][j];// 轴对称
  14.                         }

  15.                 }
  16.                 // 打印
  17.                 for (i = 0; i < n; i++) {
  18.                         for (j = 0; j < n; j++) {
  19.                                 System.out.print(array[i][j] + "\t");
  20.                         }
  21.                         System.out.println();
  22.                 }
  23.         }
  24. }
复制代码


点评

受教了 thinkyou  发表于 2014-6-15 23:31
回复 使用道具 举报
package com.itheima;

import java.util.Scanner;

public class Matrix {

        public static void main(String[] args) {
                Scanner in=new Scanner(System.in);
                System.out.print("请输入方阵的阶数:");
                int n=in.nextInt();
                showResult(n);
        }
        public static int findMin(int a,int b,int c,int d){
                 return Math.min(Math.min(a,b),Math.min(c,d));
        }
        public static void showResult(int n){
                for (int i = 1; i < n+1; i++) {
                        for (int j = 1; j < n+1; j++) {
                                System.out.print(findMin(i, j, Math.abs(n-i)+1, Math.abs(n-j)+1));
                                System.out.print(" ");
                        }
                        System.out.println();
                }
        }
}
回复 使用道具 举报
我是来学习经验的
回复 使用道具 举报
黎志勇 发表于 2014-6-15 01:43
首先建坐标系,如图所示

会发现,各个数据会以红线为轴对称,

think you 受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马