|
C语言趣味程序百例精解之java实现(100)移数字
分析如下:
程序:
import java.util.Scanner;
public class MoveNum{
int count=0;//数字移动步数计数器
int b[]=new int[9];//表示3行3列的矩阵,b[4]为空格
int t=0,w=0;
public MoveNum(int b[]){
this.b=b;
}
public static void main(String args[]){
int c[]=new int[9];
Scanner sc=new Scanner(System.in);
System.out.printf("请输入初始数字1-8:\n");
for(int i=0;i<9;i++){
if(i==4) continue;
c=sc.nextInt();
}
MoveNum moveN=new MoveNum(c);
moveN.move();
}
public void move(){
print(b);
t=find(1);//1的位置
w=next(t);//1的下一个位置
for(int k=2;k<=8;k++){
if(b[w]==k){
t=find(k);//k的位置
w=next(t);//k的下一个位置
continue;
}
if(b[w]!=k){
t= find(k);
b[4]=b[t];
b[t]=0;
print(b);
int x=prev(t);//k的前一个位置
b[t]=b[x];
b[x]=0;
print(b);
while(x!=w){
b[x]=b[prev(x)];
b[prev(x)]=0;
print(b);
x=prev(x);
}
b[x]=b[4];
b[4]=0;
t=x;
w=next(t);
}
print(b);
}
}
public int find(int k){//找k的位置
for(int i=0;i<9;i++)
if(b==k) return i;
return -1;
}
public int prev(int n){//前一个位置
int p=0;
switch(n){
case 0:
p=3;
break;
case 1:
p=0;
break;
case 2:
p=1;
break;
case 3:
p=6;
break;
case 4:
p=4;
break;
case 5:
p=2;
break;
case 6:
p=7;
break;
case 7:
p=8;
break;
case 8:
p=5;
break;
default:
p=-1;
}
return p;
}
public static int next(int n){//下一个位置
int p=0;
switch(n){
case 0:
p=1;
break;
case 1:
p=2;
break;
case 2:
p=5;
break;
case 3:
p=0;
break;
case 4:
p=4;
break;
case 5:
p=8;
break;
case 6:
p=3;
break;
case 7:
p=6;
break;
case 8:
p=7;
break;
default:
p=-1;
}
return p;
}
public void print(int n[]){
System.out.printf("---%2d---\n",count++);
for(int c=0;c<9;c++){
if(c%3==2) System.out.printf("%2d\n",n[c]);
else System.out.printf("%2d",n[c]);
}
}
}
运行测试:
C:\bat>java MoveNum
请输入初始数字1-8:
6
5
4
3
2
1
8
7
--- 0---
6 5 4
3 0 2
1 8 7
--- 1---
6 5 4
3 2 0
1 8 7
--- 2---
6 5 0
3 2 4
1 8 7
--- 3---
6 0 5
3 2 4
1 8 7
--- 4---
0 6 5
3 2 4
1 8 7
--- 5---
3 6 5
0 2 4
1 8 7
--- 6---
3 6 5
2 0 4
1 8 7
--- 7---
3 6 5
2 4 0
1 8 7
--- 8---
3 6 0
2 4 5
1 8 7
--- 9---
3 0 6
2 4 5
1 8 7
---10---
3 4 6
2 0 5
1 8 7
---11---
3 4 6
2 5 0
1 8 7
---12---
3 4 0
2 5 6
1 8 7
---13---
3 4 5
2 0 6
1 8 7 |
|