给定移动数字符串数组 Java 的递归骑士位置
Recursive Knight Positions Given Number of Moves String Array Java
我正在尝试打印给定骑士初始位置的棋盘,它显示了 8x8 棋盘上它可以在指定数量的 moves.A 示例输入和输出中到达的所有位置头脑会是这样的:
Number of Moves:1
Initial Row:3
Initial Column: 3
........
..x.x...
.x...x..
...x....
.x...x..
..x.x...
........
........
我不断收到此错误:
at KnightMoves.move(KnightMoves.java:24)
at KnightMoves.move(KnightMoves.java:27)
这是我的解决方案:
import java.util.Scanner;
public class KnightMoves{
public static void printBoard(String array [][]){
for (int row=0; row<8; row++){
for (int col=0; col<8; col++){
array [row][col]=".";
}
}
}
public static void initializeArray(String array [][]){
for (int row=0; row<8; row++){
for (int col=0; col<8; c++){
array [row][col]=".";
}
}
}
public static void move (String array [][], int steps, int row, int col){
if (steps==0){
System.exit(0);
}else{
if (row<0 || row>=8 || col<0 || col>=8){
return;
}
move(array,steps,row-2,col-1);
move(array,steps,row-2,col+1);
move(array,steps,row+2,col-1);
move(array,steps,row+2,col+1);
move(array,stepst,row-1,col-2);
move(array,steps,row-1,col+2);
move(array,steps,row+1,col-2);
move(array,steps,row+1,col+2);
steps=steps-1;
}
}
public static void main (String args[]){
Scanner s=new Scanner (System.in);
String array [][]=new String [8][8];
initializeArray(array);
System.out.println("Number of moves:");
int steps=s.nextInt();
System.out.println("Starting row:");
int row=s.nextInt();
System.out.println("Starting column:");
int col=s.nextInt();
move(array,steps,row,col);
printBoard(array);
}
}
有人可以帮我解决这个问题吗?我不知道我做错了什么。谢谢。
很好的第一次尝试。您的代码存在一些问题:
在 move 方法中,步骤的退出条件应该简单地 return,就像您对无效 row/cols 所做的那样。您还需要存储小骑士移动到的 "X"。最后,调用递归时立即减少 steps 变量。
这些变化看起来像:
public static void move(String array[][], int steps, int row, int col) {
if (steps < 0 || row < 0 || row >= 8 || col < 0 || col >= 8)
return;
array[row][col] = "X";
move(array, steps - 1, row - 2, col - 1);
move(array, steps - 1, row - 2, col + 1);
move(array, steps - 1, row + 2, col - 1);
move(array, steps - 1, row + 2, col + 1);
move(array, steps - 1, row - 1, col - 2);
move(array, steps - 1, row - 1, col + 2);
move(array, steps - 1, row + 1, col - 2);
move(array, steps - 1, row + 1, col + 2);
}
为了让电路板正确打印,在打印一行时使用 print
而不是 println
:
public static void printBoard(String array[][]) {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
System.out.print(array[row][col]);
}
System.out.println();
}
}
在此之后,您将获得预期的输出。
我正在尝试打印给定骑士初始位置的棋盘,它显示了 8x8 棋盘上它可以在指定数量的 moves.A 示例输入和输出中到达的所有位置头脑会是这样的:
Number of Moves:1
Initial Row:3
Initial Column: 3
........
..x.x...
.x...x..
...x....
.x...x..
..x.x...
........
........
我不断收到此错误:
at KnightMoves.move(KnightMoves.java:24)
at KnightMoves.move(KnightMoves.java:27)
这是我的解决方案:
import java.util.Scanner;
public class KnightMoves{
public static void printBoard(String array [][]){
for (int row=0; row<8; row++){
for (int col=0; col<8; col++){
array [row][col]=".";
}
}
}
public static void initializeArray(String array [][]){
for (int row=0; row<8; row++){
for (int col=0; col<8; c++){
array [row][col]=".";
}
}
}
public static void move (String array [][], int steps, int row, int col){
if (steps==0){
System.exit(0);
}else{
if (row<0 || row>=8 || col<0 || col>=8){
return;
}
move(array,steps,row-2,col-1);
move(array,steps,row-2,col+1);
move(array,steps,row+2,col-1);
move(array,steps,row+2,col+1);
move(array,stepst,row-1,col-2);
move(array,steps,row-1,col+2);
move(array,steps,row+1,col-2);
move(array,steps,row+1,col+2);
steps=steps-1;
}
}
public static void main (String args[]){
Scanner s=new Scanner (System.in);
String array [][]=new String [8][8];
initializeArray(array);
System.out.println("Number of moves:");
int steps=s.nextInt();
System.out.println("Starting row:");
int row=s.nextInt();
System.out.println("Starting column:");
int col=s.nextInt();
move(array,steps,row,col);
printBoard(array);
}
}
有人可以帮我解决这个问题吗?我不知道我做错了什么。谢谢。
很好的第一次尝试。您的代码存在一些问题:
在 move 方法中,步骤的退出条件应该简单地 return,就像您对无效 row/cols 所做的那样。您还需要存储小骑士移动到的 "X"。最后,调用递归时立即减少 steps 变量。
这些变化看起来像:
public static void move(String array[][], int steps, int row, int col) {
if (steps < 0 || row < 0 || row >= 8 || col < 0 || col >= 8)
return;
array[row][col] = "X";
move(array, steps - 1, row - 2, col - 1);
move(array, steps - 1, row - 2, col + 1);
move(array, steps - 1, row + 2, col - 1);
move(array, steps - 1, row + 2, col + 1);
move(array, steps - 1, row - 1, col - 2);
move(array, steps - 1, row - 1, col + 2);
move(array, steps - 1, row + 1, col - 2);
move(array, steps - 1, row + 1, col + 2);
}
为了让电路板正确打印,在打印一行时使用 print
而不是 println
:
public static void printBoard(String array[][]) {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
System.out.print(array[row][col]);
}
System.out.println();
}
}
在此之后,您将获得预期的输出。