首页 > 试题广场 >

编程输出以下格式的数据。

[问答题]
编程输出以下格式的数据。
When i=0

1

When i=1

7   8   9
6   1   2
5   4   3

When i=2

21  22  23  24  25
20    7    8    9  10
19    6    1    2  11
18    5    4    3  12
17  16  15  14  13

public class Circulate2 {

    static int i = 2;
    static int j = 1;
    // 二维数组存放矩阵
    int q = i * 2 + 1;
    int[][] s = new int[q][q];
    // 定义起始坐标
    static int x = i, y = i;

    // 位移函数
    public void up(int k, int l) {
        x = k - 1;
        y = l;
    }

    public void right(int k, int l) {
        x = k;
        y = l + 1;
    }

    public void left(int k, int l) {
        x = k;
        y = l - 1;
    }

    public void down(int k, int l) {
        x = k + 1;
        y = l;
    }

    public void move() {
        // 每个方向移动l次,每移动2个方向l+1(除最后一次)
        int l = 1, n = 0;
        for (int p = 0; p < i; p++) {
            for (int k = 1; k <= l; k++) {
                s[x][y] = j++;
                right(x, y);
            }
            n++;
            if (n % 2 == 0)
                l++;
            for (int k = 1; k <= l; k++) {
                s[x][y] = j++;
                down(x, y);
            }
            n++;
            if (n % 2 == 0)
                l++;
            for (int k = 1; k <= l; k++) {
                s[x][y] = j++;
                left(x, y);
            }
            n++;
            if (n % 2 == 0)
                l++;
            for (int k = 1; k <= l; k++) {
                s[x][y] = j++;
                up(x, y);
            }
            n++;
            if (n % 2 == 0)
                l++;
        }
        // 补全首行
        for (int k = 1; k <= q; k++) {
            s[x][y] = j++;
            right(x, y);
        }
        // 输出
        for (int k = 0; k < q; k++) {
            for (int o = 0; o < q; o++) {
                System.out.printf("%3d", s[k][o]);
            }
            System.out.println();
        }
    }

    // 执行
    public static void main(String[] args) {
        Circulate2 c = new Circulate2();
        c.move();
    }
}

发表于 2017-10-22 19:53:00 回复(2)
思路:1.逆时针绕圈螺旋,由外圈到内圈
           2.从右上角第一个数开始计数绕圈,每走一步值减一
           3. 方法:用矩形数组做阵列载体,顺时针从上-左-下-右,从外圈到内圈,由维数平方值递减赋值
代码:
class Program
    {
        static void Main(string[] args)
        {
            char ch;
            do
            {
                Console.Write("please enter i: ");
                ch = Console.ReadKey().KeyChar;
                Console.WriteLine();
                try
                {
                    //取i值
                    int input = int.Parse(ch.ToString());
                    //创建 (2*input + 1)维数组
                    int dim = 2 * input + 1;
                    int [][] arr = new int[dim][];
                    for (int i = 0; i < dim; i++)
                    {
                        arr[i] = new int[dim];
                    }
                    //由外到内,从最外圈的右上角取最大值逆时针绕圈,递减赋值
                    //初始值
                    int val = dim * dim;
                    for (int i = 0; i < dim; i++)
                    {
                        //上边
                        for (int k = dim - 1 - i; k >= 0 + i; k--)
                        {
                            arr[i][k] = val--;
                        }
                        //左边
                        for (int k = i + 1; k <= dim - 1 - i; k++)
                        {
                            arr[k][i] = val--;
                        }
                        //下边
                        for (int k = i + 1; k <= dim - 1 - i; k++)
                        {
                            arr[dim - 1 - i][k] = val--;
                        }
                        //右边
                        for (int k = dim - 1 - 1 - i; k > i;  k--)
                        {
                            arr[k][dim - 1 - i] = val--;
                        }
                    }
                    //输出
                    foreach (int[] row in arr)
                    {
                            foreach (int col in row)
                            {
                                Console.Write(col + "\t");
                            }
                            Console.WriteLine();
                     }                  
                }
                catch(Exception e)
                { 
                
                }
            }
            while (ch.ToString().ToUpper() != "Q");
        }
    }
运行结果:
发表于 2018-04-10 23:54:23 回复(1)
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数:");
        int num = scanner.nextInt();
        num=num*2+1;
        System.out.println("请输入你要打印的顺序(true为正序false逆序):");
        boolean flag=scanner.nextBoolean();
        int[][] array = printArray(num, flag);
        System.out.println("打印结果为:");
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }
    }
    private static int[][] printArray(int n,boolean flag){
        int[] numArray = new int[n * n];
        for (int i = 0; i < numArray.length; i++) {
            if (flag){
                numArray[i]=i+1;
            }else {
                numArray[i]=numArray.length-i;
            }
        }
        int index=0;
        // 确定层数
        int num=n%2==0?n/2:n/2+1;
        int[][] arr = new int[n][n];
        //从外层往内层遍历
        for (int i = 0; i < num; i++) {
            // 从右到左
            for (int j = n-i-1; j >=i; j--) {
                arr[i][j]=numArray[index++];
            }
            // 从上到下
            for (int j = i+1; j <n-i ; j++) {
                arr[j][i]=numArray[index++];
            }
            // 从左到右
            for (int j = i+1; j < n-i; j++) {
                arr[n-i-1][j]=numArray[index++];
            }
            // 从下到上
            for (int j = n-i-2; j >i; j--) {
                arr[j][n-i-1]=numArray[index++];
            }
        }
        return arr;
    }

请输入一个整数:
3
请输入你要打印的顺序(true为正序false逆序):
false
打印结果为:
43    44    45    46    47    48    49    
42    21    22    23    24    25    26    
41    20    7    8    9    10    27    
40    19    6    1    2    11    28    
39    18    5    4    3    12    29    
38    17    16    15    14    13    30    
37    36    35    34    33    32    31    
发表于 2019-09-03 11:39:57 回复(0)


萌新  暴力垃圾解法  不知道自己怎么想的写着写着就编出来了。。
/
 野猪佩奇无算法解题法 /
import java.util.;
 public class BuyBook{
 /
 public class BuyBook{
 /
@ 定义一个全局变量来存数 /
 public static int num=1;
 public static void main(String args[]) {
 Scanner sc=new Scanner(System.in);
 int n=sc.nextInt();
 int x=1;//数组的行
 int y=1;//数组的列
 int count=1;//每次逆时针需要减去的序列,每次递增2
 int a[][]=new int[n+2][];
 for(int i=0;i<n+2;i++) {//先遍历赋值不规则数组
 if(i==0||i==n+1) {
 a[i]=new int[n];
 }
 else {
 a[i]=new int[n+2];
 }
 }
 for(int i=0;i<n;i++) {
 a[0][i]=num;
 num++;


}
for(int i=0;i<n;i++) {
    a[i+1][n+1]=num;
    num++;
}
for(int i=n-1;i>=0;i--) {
    a[n+1][i]=num;
    num++;
}
for(int i=n;i>=1;i--) {
    a[i][0]=num;
    num++;
}for(int i=0;i<n;i++) {
        if(x<=(n+1)/2&&x==y&&a[x][y]==0) {//逆时针遍历数组    找到四个点遍历!!!
            for(int j=1;j<=n+1-count;j++)
            {if(a[x][y]==0) {
            a[x][y]=num;
            num++;}++y;
            }

            y--;//因为y会溢出  所以要减1  下面同理

        }
        if(x+y==n+1&&y>(n+1)/2) {
            for(int j=1;j<=n+1-count;j++) {
                if(a[x][y]==0)
                {a[x][y]=num;

            num++;}++x;
            }--x;

        }
            if(x>(n+1)/2&&x==y) {
                for(int j=1;j<=n+1-count;j++) {
                    if(a[x][y]==0) {
                    a[x][y]=num;
                    num++;}
                    --y;    }++y;

            }
                if(x+y==n+1&&y<=(n+1)/2) {
                    for(int j=1;j<=n+1-count;j++) {
                        if(a[x][y]==0) {
                        a[x][y]=num;
                        num++;}
                        --x;}
                    x+=2;
                    y++;//遍历要回到   逆时针的尾部而非头部   如果是头部则无法继续遍历  出现错误!
                    count+=2;}} 

System.out.println(x+" "+y);
for(int i=0;i<n+2;i++) {
    for(int j=0;j<a[i].length;j++) {
        System.out.print(a[i][j]+" ");
    }
    System.out.println();
}
    }}
编辑于 2018-05-09 22:46:43 回复(0)
import itertools


def spiral(init):
    # 定义生成的行数
    hang = 2 * init + 1
    # 右面开始,逆序生成螺旋数组
    status = itertools.cycle(['left', 'down', 'right', 'up'])  # 用于状态周期性的切换
    movemap = {
        'right': (1, 0),
        'down': (0, 1),
        'left': (-1, 0),
        'up': (0, -1),
    }
    # 初始化二维数组
    position_map = dict.fromkeys([(x, y) for x in range(hang) for y in range(hang)])
    # 初始化当前位置以及当前方向
    positon = (hang-1,0)
    # 从25开始向左
    new_status = next(status)
    # 从最大值开始
    for i in range(hang * hang, 0, -1):
        old_positon = positon
        positon = tuple(map(sum, zip(positon, movemap[new_status])))
        # 如果超过范围或者碰到已经有值的位置则切换方向
        if (positon not in position_map) or (position_map[positon]):
            new_status = next(status)
            positon = tuple(map(sum, zip(old_positon, movemap[new_status])))
        # 相当于自加
        position_map[old_positon] = i

    print("When init={}".format(init))
    for i in range(hang):
        for j in range(hang):
            print((position_map[(j, i)]), end='\t')
        print('\n')


if __name__ == "__main__":

    spiral(3)


编辑于 2018-04-08 13:36:53 回复(1)
鷐头像
//螺旋数组
function spiralArray(num){
    var n=2*num+1;
    //一维数组
    var a=new Array(n);
    //二维数组
    for(var i=0;i<=n-1;i++){
        a[i]=new Array(n);
    }
    //数组的值全部赋值0
    for(var i=0;i<=n-1;i++){
        for(var j=0;j<=n-1;j++){
            a[i][j]=0;
        }
    }
    //中心
    a[num][num]=1;
    //右侧
    function arrR(e){
        for(var k=1;k<=2*i;k++){
            a[k+num-i][num+i]=k+a[num-i+1][num+i-1];
        }
    }
    //下方
    function arrD(e){
        for(var k=1;k<=2*i;k++){
       
            a[num+i][num+i-k]=k+a[num+i][num+i];
        }
    }
    //左侧
    function arrL(e){
        for(var k=1;k<=2*i;k++){
         
            a[num+i-k][num-i]=k+a[num+i][num-i];
        }
    }
    //上方
    function arrU(e){
        for(var k=1;k<=2*i;k++){
         
            a[num-i][num-i+k]=k+a[num-i][num-i];
        }
    }
    if(num>=0){
        for(var i=1;i<=num;i++){
    
            arrR(i);
            arrD(i);
            arrL(i);
            arrU(i);
        }
    }
    //输出打印数组
    document.write("<table style='text-align:center;'>")
    for(var i=0;i<=n-1;i++){
        document.write("<tr>")
        for(var j=0;j<=n-1;j++){
            document.write("<td>"+a[i][j]+"</td>");
         
        }
        document.write("</tr>")
    }
    document.write("</table>")
}
编辑于 2017-11-21 09:58:21 回复(0)
开始以最中间为起点(终点),每一轮旋转到终点就以终点右移为新的起点,以终点右上移为新的终点。递归此过程
发表于 2017-10-25 11:35:24 回复(0)
#coding=utf-8
#思路:逆时针绕圈螺旋,需要知道起始位置,上下左右走的步数以及最后终止的结束位置。
def getarray(n):
    res = [[0]*(n*2+1) for i in range(n*2+1)] # 初始化螺旋数组
    # return res
    if n == 0:
        return [[1]]
    res[n][n] = 1  # 中心点
    startX = n  # 起始点坐标x
    startY = n+1  # 起始点坐标y
    steps = 2  # 上下左右需要走的步数
    val = 2  # 赋值
    while startX != 0:  # 范围是1-n
        x = startX
        y = startY
        res[x][y] = val  # 起始点
        # 向下走
        for i in range(1,steps): 
            val += 1
            x += 1
            res[x][y] = val  # 起始点
        # 向左走
        for i in range(steps):
            val += 1
            y -= 1
            res[x][y] = val 
        # 向上走
        for i in range(steps):
            val += 1
            x -= 1
            res[x][y] = val
        # 向右走
        for i in range(steps):
            val += 1
            y += 1
            res[x][y] = val 
        val += 1
        startX -= 1
        startY += 1
        steps = steps+2
    return res
 
if __name__ == "__main__":
    n = int(raw_input())
    res = getarray(n)
    for i in range(len(res)):
        for j in res[i]:
            print str(j)+' ',
        print '\n'

发表于 2018-04-23 11:54:07 回复(0)
1111
发表于 2018-04-11 16:18:44 回复(0)
以前写过正向的,这是正方形,是有规律的。这个正方形长度应该是n=i*2+1。先确定开始数,确定开始行,每行输入n-1个数,输入完,对数组翻转90度(正向或反向看你想输出的图形了)。取相同行数接着输入(相同行4次,也就是翻转一圈,行数增加1)。输入最后一个数结束。
编辑于 2018-02-28 22:54:00 回复(0)
// 算法解析 // 1、输入整数n,输出二维螺旋数组,0,0处为2*n-1的平方,逆时针减小; // 2、减小1圈共4种状态,放在state中,第k圈中,每种状态减小2*(n-k-1)次,每次减小后,数组下标根据当前状态做出改变 function spiralArray(n) { if (typeof n !== 'number' || n < 1) throw new Error('输入正确的参数') let max = Math.pow(2 * n + 1, 2); const arr = new Array(2 * n + 1); const state = new Array([1, 0], [0, 1], [-1, 0], [0, -1]); for (let i = 0; i < arr.length; i++) { //生成二维数组 arr[i] = new Array(2 * n + 1); } for (let k = 0; k <= n + 1; k++) { //从最外围到中心共有n个螺旋 let row = k, //[row, col]每个螺旋的起点 col = k; for (let i = 0; i < state.length; i++) { //每一圈4种状态,每次减小都根据当前状态改变row,col的值 let time = 1; //每一种状态遍历的次数,第k圈中,每种状态减小2*(n-k-1)次 while (time <= 2 * (n - k)) { arr[row][col] = max; max--; time++; row += state[i][0]; //根据当前状态改变下标值 col += state[i][1]; } } } arr[n][n] = 1; //填充中心 return arr; } console.log(spiralArray(2))
发表于 2018-01-30 22:21:10 回复(0)
#include
#define N 100//使数组尽量大一点
int main()
{
    int a[N][N];
    int i,j,n,x1,x2;
    int key;
    scanf("%d",&key);
    n=2*key+1;
    x1=n-1;
    x2=0;
    j=n*n;
    do
    {
        for(i=x1;i>=x2;i--,j--)
        {
            a[x1][i]=j;
        }
        for(i=x1-1;i>=x2;i--,j--)
        {
            a[i][x2]=j;
        }
        for(i=x2+1;i<=x1;i++,j--)
        {
            a[x2][i]=j;
        }
        for(i=x2+1;i<=x1-1;i++,j--)
        {
            a[i][x1]=j;
        }
        x1--;
        x2++;
    }while(x1>=x2);
    for(i=n-1;i>=0;i--)
    {
        for(j=0;j<n;j++)
            printf("%2d ",a[j][i]);
        printf("\n");
    }
}
发表于 2018-01-07 16:40:44 回复(0)
/*
*编程输出以下格式的数据。
*When i=0
*1
*When i=1
*7   8   9
*6   1   2
*5   4   3
*When i=2
*21  22  23  24  25
*20  7   8   9   10
*19  6   1   2   11
*18  5   4   3   12
*17  16  15  14  13
* */
public class PrintFormatLuoXuan {
    public static void main(String[] args){
        printLuoXuan(0);
        printLuoXuan(1);
        printLuoXuan(2);
        printLuoXuan(3);
    }
    static int res[][] ;
    /*
    * *************************************************************
    * 实现思路:
    * *************************************************************
    * 1、这是一个(2*i+1)*(2*i+1)的数列;
    * 2、每个数值的计算规则是从最外层右上角开始递减;
    * -------------------------------------------------------------
    * 分析处理办法:
    * -------------------------------------------------------------
    * 1、理解这个数列为一个回字形状的结构,口字逐层嵌套;
    * 总的口字数 = ((2*+1)+1)/2
    * 2、一个口字的四条边的索引和四个顶角的初始值和运算值如下:
    * ------------------------------------------------------------
    * int con = 2*i+1;//first 最外层口字的边长
    * int rows = (con+1)/2;//总的口字数
    * int conu = con -2*r;//每个口字的边长
    * int cons = con -2*(r+1);//上一个口字的边长
    * ------------------------------------------------------------------------------------------------
    *           |        index                   |    initial_value    |     runtime_value
    * ------------------------------------------------------------------------------------------------
    * ------------------------------------------------------------------------------------------------
    * 右上角:upNum:|   [r][r+(conu-1)-c]            |(2*i+1)*(2*i+1)     | riNum(上一个口字的)
    * 左上角:leNum:|   [r+c][r]                     | upNum - (con -1)    | upNum - (cons -1)
    * 左下角:doNum:|   [r+(conu-1)][r+c]            | leNum - (con -1)    | leNum - (cons -1)
    * 右下角:riNum:|   [r+(conu-1)-c][r+(conu-1)]   | doNum - (con -1)    | doNum - (cons -1)
    * ------------------------------------------------------------------------------------------------
    * 3、每个口字的边只循环递减conu - 1次;
    * 4、由于con总是奇数,所以对索引[rows-1][rows-1]的值直接赋值为1;
    * 5、使用for each 和printf()方法遍历结果数组,打印输出;
    * */
    public static void printLuoXuan(int i){
        int con = 2*i+1;//first 最外层口字的边长
        int rows = (con+1)/2;//总的口字数
        res = new int[con][con];
        int upNum = con*con;
        int leNum = upNum - (con -1);
        int doNum = leNum - (con -1);
        int riNum = doNum - (con -1);
        for (int r=0;r<rows;r++){
            int conu = con -2*r;//每个口字的边长
            int cons = con -2*(r+1);//上一个口字的边长
            for (int c=0;c<conu-1;c++){
                //print upRow
                res[r][r+(conu-1)-c] = upNum--;
                //print leftColumn
                res[r+c][r] = leNum--;
                //print downRow
                res[r+(conu-1)][r+c] = doNum--;
                //print rightColumn
                res[r+(conu-1)-c][r+(conu-1)] = riNum--;
            }
            upNum = riNum;
            leNum = upNum - (cons -1);
            doNum = leNum - (cons -1);
            riNum = doNum - (cons -1);
        }
        //for res[rows-1][rows-1] 赋值
        res[rows-1][rows-1] = 1;
        //print out result
        for (int[] es:res){
            for (int e:es){
                System.out.printf("%4d",e);
            }
            System.out.println();
        }
    }
}

编辑于 2018-01-06 10:33:06 回复(1)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Software: PyCharm

global num
def right(i):
    global arr
    for k in range(1,2 * i + 1):
        arr[num+k-i][num+i] = k + arr[num-i+1][num+i-1]
def down(i):
    for k in range(1,2 * i + 1):
        arr[num+i][num-k+i] = k + arr[num+i][num+i]
def left(i):
    for k in range(1,2 * i + 1):
        arr[num-k+i][num-i] = k + arr[num+i][num-i]
def up(i):
    for k in range(1,2 * i + 1):
        arr[num-i][num-i+k] = k + arr[num-i][num-i]
def screw_num_display():
    n = num * 2 + 1
    global arr
    arr = [[0 for i in range(n)] for j in range(n)]
    arr[num][num] = 1
    for i in range(1,num+1):
        right(i)
        down(i)
        left(i)
        up(i)
    for i in range(n):
        print(arr[i])
num = int(raw_input('请输入一个整数'))
screw_num_display()
发表于 2017-12-09 22:06:15 回复(0)
public class Niu5 { public static void main(String []args) { Scanner scan=new Scanner(System.in); int s=Integer.parseInt(scan.next()); pr(s); } static void pr(int a) { int b=a,i=0,j=0,n=1,m=0,u=(a*2+1)*(a*2+1); int r[][]=new int[a*2+1][a*2+1]; r[b][b]=n; while(n<u) { m++; for(int p=1;p<=m;p++) { n++; if(n>u) { break; } j++; r[b+i][b+j]=n; } for(int q=1;q<=m;q++) { n++; if(n>u)break; i++; r[b+i][b+j]=n; } m++; for(int p=1;p<=m;p++) { n++; if(n>u)break; j--; r[b+i][b+j]=n; } for(int q=1;q<=m;q++) { n++; if(n>u)break; i--; r[b+i][b+j]=n; } } for(int q=0;q<(a*2+1);q++) //输出 { for(int p=0;p<(a*2+1);p++) { System.out.print(r[q][p]+" "); if(r[q][p]<10)System.out.print(" "); } System.out.println(); } } }
发表于 2017-12-07 14:34:55 回复(0)
package cn.one; //螺旋输出,从内到外增大,即从外到内依次减小 import java.util.Scanner; public class For_6 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("请输入一个大于等于0的整数:"); Scanner sc=new Scanner(System.in); int num=sc.nextInt()*2+1; if(num<=0){ throw new RuntimeException("请输入一个大于0的整数"); } int[][] arr=new int[num][num]; arr=creatArray(arr); printArray(arr); } private static int[][] creatArray(int[][] arr) { // TODO Auto-generated method stub int i=0;//数组下标 int c=0,d=0;//c层数,每一层都是一个正方形,总共有四条边,正方形的四个顶点都是拐点。d为拐点 int x=arr.length;//数组长度 int j=x-1;//数组下标 int maxValue=x*x;//数组最大值 for(int k=maxValue;k>=1;k--){ if(d==0){ if(j==c){//第0个拐点 d=1;//进入下一拐点 }else{ arr[i][j]=k; j--;//此时从右到左赋值,j++ continue; } } if(d==1){ if(i==x-c-1){ d=2; }else{ arr[i][j]=k; i++;//从上到下,i++ continue; } } if(d==2){ if(j==x-c-1){ d=3; }else{ arr[i][j]=k; j++;//从左到右,j++ continue; } } if(d==3){ if(i==c+1){//第四个拐点条件 arr[i][j]=k; d=0; c++; j--; }else{ arr[i][j]=k; i--;//从下到上,i-- continue; } } } return arr; } private static void printArray(int[][] arr) { // TODO Auto-generated method stub for(int x=0;x<arr.length;x++){ for(int y=0;y<arr[x].length;y++){ System.out.print(arr[x][y]+"\t"); } System.out.println(); } } }
发表于 2017-08-28 12:00:39 回复(0)