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循环结束为更短的代码?
有人说我可以编写这个使用JUST 2行,我认为这很奇怪......但是他们说它很可行!
任何提示,帮助或指针都将不胜感激!
非常感谢你!
答案 0 :(得分: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));
}
答案 1 :(得分: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)使用时,您可以将多少代码压缩到一行代码中适当的三元运算符和递归...