来源于 http://hi.baidu.com/shijiebei_2009/item/3629962d7056e50043634a69
以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中
import java.util.Scanner;
/**
* 从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如:
输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*
* @author wangxu
* date:2012/3/24
* 说明:时间有限,给一个不太优化的代码,足以实现功能
* 思路:先声明一个二维数组用来存储每个对应的数字,对数组赋值完成之后就可以打印输出
* 我的代码可以实现整型以内的所有合法数字,并不局限于20以内
*
*/
public class Demo {
static int arr[][];//二维数组用来存储数字
static int currentNumber = 1;// 从1开始打印,用来控制整个流程需要打印的数字
static int num = 0;//用来判断何时可以打印
public static void main(String args[]) throws Exception {
Scanner in = new Scanner(System.in);//获取输入流
System.out.println("请输入您希望打印的矩阵的最大的值:");//打印提示信息
String input = in.next();//获取用户的输入
int count = 0;//计数器
if (input.matches("\\d+")) {// 输入正确,用来检验用户输入的是否是数字
num = Integer.parseInt(input);
count = num;// count用来控制在每一个方向上打印几个数字,第一次打印时候和用户输入的数字相同
} else {
System.out.println("您输入的数据不正确,系统推出!");
System.exit(0);
}
arr = new int[num][num];//实例化数组
moveRight(count, 0, 0);//调用右移函数
}
public static void moveRight(int count, int rowIndex,
int columnIndex) {//count表示移动几步,由题目可以看出右移时候次数和是用户输入的数字,下移减1,左移不变,上移减1,右移不变
if(judge()){//如果数组已经赋值结束,就打印出来
print();
}else{
int temp = 0;//临时变量
while (temp < count) {
arr[rowIndex][columnIndex] = currentNumber;
temp ++;//临时变量自增
columnIndex++;//向右移动
currentNumber++;//当前要打印的数字自增
}
count--;//将打印次数减1
columnIndex--;//下标归位
rowIndex++;//下移一位
moveDown(count,rowIndex,columnIndex);
}
}
public static void moveDown(int count,int rowIndex,int columnIndex) {
if(judge()){
print();
}else{
int temp = 0;
while(temp < count){
arr[rowIndex][columnIndex] = currentNumber;
temp ++;
rowIndex++;
currentNumber++;
}
rowIndex--;
columnIndex--;//左移一位
moveLeft(count, rowIndex, columnIndex);
}
}
public static void moveLeft(int count,int rowIndex,int columnIndex) {
if(judge()){
print();
}else{
int temp = 0;//临时变量
while(temp < count){
arr[rowIndex][columnIndex]=currentNumber;
temp ++;
columnIndex--;//左移一位
currentNumber++;//数字自增
}
count--;//次数减1
columnIndex++;
rowIndex--;//上移一位
moveUp(count, rowIndex, columnIndex);
}
}
public static void moveUp(int count,int rowIndex,int columnIndex) {
if(judge()){
print();
}else{
int temp = 0;
while(temp < count){
arr[rowIndex][columnIndex] = currentNumber;
temp ++;
rowIndex--;
currentNumber++;
}
rowIndex++;
columnIndex++;//右移一位
moveRight(count, rowIndex, columnIndex);
}
}
public static void print(){//在控制台打印
for(int row[]:arr){
for(int column:row){
System.out.print(column+"\t");
}
System.out.println();//换行打印
}
}
public static boolean judge(){
if(currentNumber>Math.pow(num, 2)){//如果数组已经赋值结束,就打印出来
return true;
}else{
return false;
}
}
}
分享到:
相关推荐
关于一个螺旋数字的java例子有注释,有控制台输入,希望对你有用
看见有些拿螺旋数字矩阵做考题的,虽然本来也不难,可是你要一着急也许就想不出来了呢:)
通达信菲波纳契螺旋数字主图指标.doc
指南者稳盈一号指标期货傻瓜式买卖指标螺旋数字公式源码.doc
(C卷,100分)- 螺旋数字矩阵(Java & JS & Python & C).html
华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++).html付费专栏内容,免费下载,多种语言解法
【免费题库】华为OD机试 - 螺旋数字矩阵(Java & JS & Python & C & C++).html
从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中
C++实现螺旋矩阵,螺旋数字排列,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环
能印任意数字螺旋矩阵。如输入3 打印如下: 1 8 7 2 9 6 3 4 5
基于数字螺旋成像方法的衍射理论,吴自文,陈理想,本文以拉盖尔-高斯模式作为正交完备的基矢,将数字螺旋成像方法应用于光的衍射问题,提出了一种新颖、普适的衍射理论。对携带轨�
休闲之余,写了一下这个小小的螺旋方阵的小程序,和大家分享一下。
螺旋数组问题,相信很多人都做过了,初学者可以看一下,应该会有用处的。
利用UG_GRIP构建螺旋桨三维数字模型.pdf
输入两个不大于10的整数m和n,输出m×n的逆时针形式的螺旋矩阵,输出数字占2位,数字间用1个空格分割。(类名SpiralMatrix)
将螺旋分别做成了不同块划分来写的,分别使用4个三角形的形状的数字 组成一个正方形,没个 循环控制一个三角形的数字
采用约束坐标轮换法,以弹簧钢丝直径、弹簧中径、弹簧工作圈数为设计变量,以弹簧质量最小作为优化设计目标,对压缩圆柱螺旋弹簧进行优化设计,既能做到各参数之间的优化组合,又能缩短设计周期。设计结果表明,弹簧的质量...
向标准输出输出一个N*N的螺旋矩阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素,每个数字占5个字符宽度,向右对齐,不足部分补以空格。在每一行末均输出一个回车符。
螺旋方阵存放在n*n的二维数组中并将其打印输出,要求n由程序读入,数字螺旋方阵由程序自动生成(而非人为的初始化或逐个输入)。 例如: 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9
有三个代码,螺旋方阵,数字塔,约瑟夫环,很适合课程设计,作为参考。