记得刚刚吐槽了半天那个不知道哪里出了bug的代码……
自己被搞得要死要活的……
终于,在我舍友的帮助下,找出了bug……真的是坑……为了保留此修改记录,我原来的错误代码不删除。
错误点:
- b[][num]越界了!编译器竟然不报错。。。真的是无奈
- cha变量在循环时没有刷新……这个后来我自己debug的时候发现了
- 我!多!加!了!一!个!感!叹!号!!哇。。。真的委屈,这个小错误真的难找,编译器不报错,逻辑也没错,调试半天没用,可答案就是错的。。。
行吧……接下来贴出正确的代码……搞了一个晚上……百感交集……QAQ
package hello;
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
//TODO汉诺塔游戏
Scanner in=new Scanner (System.in);
System.out.println("请输入要搬运的小块的个数:");
int num=in.nextInt();
int a,b;
int temp = 0;
int cha=1;
int[][] m=new int[3][num];
for(int i=0;i<num;i++)
m[0][i]=i;
for(int i=1;i<3;i++)
{
for(int j=0;j<num;j++)
m[i][j]=99999;
}
for(int i=0;i<3;i++) {
for(int j=0;j<num;j++)
System.out.print(m[i][j]+" ");
System.out.print("\n");}
OUT:
while(true)
{
cha=1;
System.out.println("请输入要移动起始和终止的列数");
a=in.nextInt();
b=in.nextInt();
for(int i1=0;i1<num;i1++)
{
if(m[a][i1]!=99999)
{
temp=m[a][i1];
m[a][i1]=99999;
break;
}
}
if(m[b][num-1]==99999) {
m[b][num-1]=temp;
}
else
{
for(int i1=0;i1<num;i1++)
{
if(m[b][i1]!=99999&&temp<m[b][i1])
{
m[b][i1-1]=temp;
break;
}
}
}
for(int i1=0;i1<num;i1++)
{
if(m[2][i1]!=i1)
cha=0;
}
for(int i1=0;i1<3;i1++) {
for(int j=0;j<num;j++)
System.out.print(m[i1][j]+" ");
System.out.print("\n");
}
if(cha==1)
{
System.out.println("成功!");
break OUT;
}
}
}
}
运行结果示例:
请输入要搬运的小块的个数:
3
0 1 2
99999 99999 99999
99999 99999 99999
请输入要移动起始和终止的列数
0 2
99999 1 2
99999 99999 99999
99999 99999 0
请输入要移动起始和终止的列数
0 1
99999 99999 2
99999 99999 1
99999 99999 0
请输入要移动起始和终止的列数
2 1
99999 99999 2
99999 0 1
99999 99999 99999
请输入要移动起始和终止的列数
0 2
99999 99999 99999
99999 0 1
99999 99999 2
请输入要移动起始和终止的列数
1 0
99999 99999 0
99999 99999 1
99999 99999 2
请输入要移动起始和终止的列数
1 2
99999 99999 0
99999 99999 99999
99999 1 2
请输入要移动起始和终止的列数
0 2
99999 99999 99999
99999 99999 99999
0 1 2
成功!