0
public class MagicSquare
{
    public static int[][] grid = new int[3][3];
    public static int i = 0;
    public static int j = 0;

    public static void main(String[] args) {

       int x = 1;
       int y = 2;
       int z = 0;

       while(z < 9)
       {
             int holdx = x;
             int holdy = y;
             z++;
             x++;
             y--;

       if(x == 3)
       {
             x = 0;
       }

       if(y == -1)
       {
             y = 2;
       }

       if(y == 3)
       {
             y = 0;
       }

       if(grid[x][y] == 0)
       {
            grid[x][y] = z;
       }

       else
       {
            holdy++;

            if(holdy == 3)
            {
                 holdy = 0;
            }

            grid[holdx][holdy] = z;
            x = holdx;
            y = holdy;
       }
       }       

       for(int i = 0; i < 3; i++)
       {
            System.out.print(grid[i][0]+", ");
       }

       System.out.println(" ");

       for(int i = 0; i < 3; i++)
       {
            System.out.print(grid[i][1]+", ");
       }

       System.out.println(" ");

       for(int i = 0; i < 3; i++)
       {
            System.out.print(grid[i][2]+", ");
       }
}

输出如下所示:

2, 4, 9,
6, 8, 1,
7, 3, 5,

你好,我写了一个黑魔法代码,它能够填充正方形的网格,但如果它填充了一个数字,那么下一个数字将被放在它当前位置下方的正方形中.

然后,向上和向右移动一个正方形并将下一个整数放在那里,如果我也离开网格,那么下一个数字将环绕到底部和/或左侧。该程序运行直到所有的方块都被填满。

我想知道是否可以将我的代码从我的 while 循环开始到我的 for 循环结束压缩成更短的代码?

有人说我只用 2 行就可以编写代码,我认为这很奇怪……但他们说这是可行的!

任何提示、帮助或指针将不胜感激!

太感谢了!

4

2 回答 2

2

不确定少于 3 行(至少在不牺牲可读性的情况下),但您可以肯定地压缩这些 if 语句。

if(x == 3) {
     x = 0;
}

if(y == -1) {
     y = 2;
}

if(y == 3) {
     y = 0;
}

简单地下来

x = x % 3;
y = (y + 3) % 3;

你可以把它们拉到以前的x++y--

x = (x + 1) % 3;
y = ((y - 1) + 3) % 3;

同样holdy(如果你真的需要那个值,我不知道)。

然后,如果您只想打印数组,可以缩短 for 循环。

for(int[] row : grid) {
    System.out.println(Arrays.toString(row));
}
于 2016-11-11T23:06:19.483 回答
0

大约 10 年前,我编写了以下代码来计算幻方的条目。在某种意义上,这可以归结为一行代码,并且适用于任意奇数边长:

class M
{
    public static void main(String args[])
    {
        int n = 5;
        int a[][] = new int[n][n];
        f(n,1,n/2,n-1,a);
        print(a);
    }

    static int f(int j,int i,int k,int l,int I[][])
    {
        return i>j*j?i-1:(I[k][l]=f(j,i+1,(k+(i%j==0?0:1))%j,(l+(i%j==0?-1:1))%j,I))-1;
    }

    public static void print(int a[][])
    {
        for (int i=0; i<a.length; i++)
        {
            for (int j=0; j<a[i].length; j++)
            {
                System.out.print((a[j][i]<10?" ":"")+a[j][i]+" ");
            }
            System.out.println();
        }
    }
}

当然,它在某种程度上受到了IOCCC的启发,并且更适合Programming Puzzles & Code Golf,但可能会显示当您(ab)适当地使用三元运算符和递归时,您可以在一行代码中按下多少.. .

于 2016-11-11T23:36:56.507 回答