This question already has answers here:
Looping in a spiral
(33个答案)
可能重复:
Looping in a spiral
我正在创建一个程序来填充3乘3矩阵我想得到这样的结果
你可能已经注意到这是一个螺旋。
现在我使用的算法是:我有一个二维数组,其中的值表示数字的坐标。首先,我指定这个数组中的每个数字坐标的值为10然后从9开始,我减少我的x坐标,并将坐标值赋给currentnum-1,直到它到达终点或它的值不是10;然后我做同样的事情,除了增加Y的值;然后减少x的值;然后减少Y的值;
我给每一个数字分配10的原因就像它是我的程序的一条路。因为当前数值永远不会超过9。如果一个正方形的值是10,它就像一个绿灯。如果不是10,则表示已将一个值分配给该正方形,则该值将从该正方形中断。
这是我的代码,请注意它是用Java编写的
我有个错误
既然我是Java新手,有人能建议一个可行的解决方案吗?如果你发现我的算法有任何问题,请告诉我。
(33个答案)
可能重复:
Looping in a spiral
我正在创建一个程序来填充3乘3矩阵我想得到这样的结果
5 4 3
6 1 2
7 8 9
你可能已经注意到这是一个螺旋。
现在我使用的算法是:我有一个二维数组,其中的值表示数字的坐标。首先,我指定这个数组中的每个数字坐标的值为10然后从9开始,我减少我的x坐标,并将坐标值赋给currentnum-1,直到它到达终点或它的值不是10;然后我做同样的事情,除了增加Y的值;然后减少x的值;然后减少Y的值;
我给每一个数字分配10的原因就像它是我的程序的一条路。因为当前数值永远不会超过9。如果一个正方形的值是10,它就像一个绿灯。如果不是10,则表示已将一个值分配给该正方形,则该值将从该正方形中断。
这是我的代码,请注意它是用Java编写的
public class spiral {
/**
* @param args
*/
public static void main(String[] args) {
int spiral [] [] = new int[3][3];
for(int i = 0; i <= 2; i++){
for(int j = 0; j <= 2; j++){
spiral[i][j] = 10;
}
}
//0 is x value, 1 is y value
spiral[0][0] = 9;
int x = 1;
int y = 1;
int counter = 1;
int currentnum = 9;
int gridsquare = 3;
for(int i = 0; i <= 8; i++){
if(counter == 5){
counter = 1;
}
if(counter == 1){
System.out.println(x + " " + y);
for(int j = 0;j <= 1;j++){
if(spiral[x][y] == 10){
spiral[x][y] = currentnum;
currentnum--;
x += 1;
}
else{
y += 1;
break;
}
}
}
if(counter == 2){
for(int k = 0; k <= 0; k++){
System.out.print(x + " " + y);
if(spiral[x][y] == 10){
spiral[x][y] = currentnum;
currentnum--;
y += 1;
}
else{
x -= 1;
break;
}
}
}
if(counter == 3){
for(int z = 0; z <= 0; z++){
if(spiral[x][y] == 10){
spiral[x][y] = currentnum;
currentnum--;
x -= 1;
}
else{
y -= 1;
break;
}
}
}
if(counter == 4){
for(int b = 0; b <= 0; b++){
if(spiral[x][y] == 10){
spiral[x][y] = currentnum;
currentnum--;
y -= 1;
}
else{
x += 1;
break;
}
}
}
counter++;
}
System.out.print(currentnum);
}
}
我有个错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at spiral.main(spiral.java:44)
既然我是Java新手,有人能建议一个可行的解决方案吗?如果你发现我的算法有任何问题,请告诉我。
最佳答案
你不需要预先填写10:0也行。
我认为解决螺旋的最佳方法是考虑如何手动执行:从一个角落开始,水平移动,直到到达非零或数组的边缘。然后右转当当前数字超过N*N时停止。
现在让我们看看算法的每个部分意味着什么:
从角落开始意味着设置x=0和y=0。
直线表示x=x+dx,y=y+dy,其中dx或dy为零,dy或dx为1或-1。
右转意味着将dx指定给dy,-dy指定给dx。
下面是它在代码中的外观:
int current = 1;
// Start in the corner
int x = 0, y = 0, dx = 1, dy = 0;
while (current <= N*N) {
// Go in a straight line
spiral[x][y] = current++;
int nx = x + dx, ny = y + dy;
// When you hit the edge...
if (nx < 0 || nx == N || ny < 0 || ny == N || spiral[nx][ny] != 0) {
// ...turn right
int t = dy;
dy = dx;
dx = -t;
}
x += dx;
y += dy;
}
关于java - Java创建螺旋式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8380587/
10-11 04:04