69,369
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
import java.util.Scanner;
public class KnightTra {
/*标志点是否走过*/
private boolean IsTra[][]=new boolean[8][8];
/*储存路劲用的栈,储存的元素是一个坐标,在KData定义*/
private Stack<KData> TraWay=new Stack<KData>();
/*备用路径栈*/
Stack<KData> TraWayBU=new Stack<KData>();
/*指示标志,每走过一个点加1,当为64时,则已遍历*/
private int TraNo;
/*给出起始点初始化一个对象*/
KnightTra(KData kd){
/*检查起始点是否合法,不合法,退出程序*/
if(!CheckData(kd.x,kd.y)){
System.out.println("请给出一个棋盘上的点!");
System.exit(1);
}
/*初始化点指示标志,所有都标志为false,即都没走过*/
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
IsTra[i][j]=false;
/*走过起始点*/
IsTra[kd.x][kd.y]=true;
/*起始点入栈*/
TraWay.push(kd);
/*总共走过一个点*/
TraNo=1;
}
/*检查点是否在棋盘上*/
private boolean CheckData(int x,int y){
if(x<0||x>7||y<0||y>7)
return false;
else
return true;
}
/*把路径栈的数据复制到备用数据栈里面*/
private void BUData(){
Stack<KData> Temp=new Stack<KData>();
KData Ktemp;
/*把路径栈的数据转移到Temp*/
while(!TraWay.isEmpty()){
Ktemp=new KData(TraWay.pop());
Temp.push(Ktemp);
}
/*清空备用栈的数据*/
while(!TraWayBU.isEmpty())
TraWayBU.pop();
/*把数据放回原栈和备用栈*/
while(!Temp.isEmpty()){
Ktemp=new KData(Temp.pop());
TraWay.push(Ktemp);
TraWayBU.push(Ktemp);
}
}
/*检查一个点kd的一个方向(用x和y表示八个方向)上的一个点是否走过
* 若没有,则把改点入栈,并标志改点。
*/
private boolean FP(KData kd,int x,int y){
/*检查这个方向是否还可以走*/
if(this.CheckData(kd.x+x, kd.y+y)&&IsTra[kd.x+x][kd.y+y]==false){
IsTra[kd.x+x][kd.y+y]=true;
TraWay.push(new KData(kd.x+x,kd.y+y));
TraNo++;
return true;
}
else
return false;
}
/*从路径栈取出一点,检查它的四周是否有可走的点,有则返回真,没有则返回假*/
private boolean FindPoint(){
KData kd=new KData(TraWay.pop());
/*取出点要回栈*/
TraWay.push(kd);;
/*分别检查八个方向是否可走*/
if(FP(kd,1,2))
return true;
else if(FP(kd,2,1))
return true;
else if(FP(kd,2,-1))
return true;
else if(FP(kd,1,-2))
return true;
else if(FP(kd,-1,-2))
return true;
else if(FP(kd,-2,-1))
return true;
else if(FP(kd,-2,1))
return true;
else if(FP(kd,-1,2))
return true;
else
return false;
}
/*检查一个点的四周是否有可走的点,有则返回真,没有则返回假*/
private boolean FindPoint(KData kd){
if(FP(kd,1,2))
return true;
else if(FP(kd,2,1))
return true;
else if(FP(kd,2,-1))
return true;
else if(FP(kd,1,-2))
return true;
else if(FP(kd,-1,-2))
return true;
else if(FP(kd,-2,-1))
return true;
else if(FP(kd,-2,1))
return true;
else if(FP(kd,-1,2))
return true;
else
return false;
}
public void FindWay(){
KData kd;
/*如果没有走够个点,就一直循环*/
while(this.TraNo<64){
/*检查路径栈最后一个点的四周是否有可走的点*/
while(!this.FindPoint()){
/*路径栈最后一个点的四周找不到可走的点,把数据复制到备用栈*/
this.BUData();
/*在备用栈取出一个点,检查其四周是否有可以走的点,其实就是后退一步找可以走的点*/
kd=new KData(TraWayBU.pop());
/*检查后退一步的点是否有可走的点,没有且没走够个点,继续后退*/
while(!this.FindPoint(kd)&&this.TraNo<64){
kd=new KData(TraWayBU.pop());
/*后退的点也是路径的一部分*/
TraWay.push(kd);
}
if(this.TraNo==64)
break;
}
}
}
/*打印路径*/
public void PrintWay(){
int i=1;
KData Ktemp;
Stack<KData> Temp=new Stack<KData>();
/*因为栈是先进后出的,所以要倒置一下先*/
while(!TraWay.isEmpty()){
Ktemp=new KData(TraWay.pop());
Temp.push(Ktemp);
}
while(!Temp.isEmpty()){
Ktemp=new KData(Temp.pop());
/*打印时不破坏路径栈*/
TraWay.push(Ktemp);
System.out.print("("+Ktemp.x+","+Ktemp.y+")-->");
/*格式控制,每5个点一行*/
i++;
if(i%5==0)
System.out.println();
}
System.out.println("游完了!");
}
public static void main(String args[]){
/*让用户自己输入起始点*/
int x,y;
Scanner reader=new Scanner(System.in);
System.out.println("请输入起始点的横坐标(在0和7之间):");
x=reader.nextInt();
System.out.println("请输入起始点的纵坐标(在0和7之间):");
y=reader.nextInt();
KnightTra kt=new KnightTra(new KData(x,y));
/*找路径和打印路劲*/
kt.FindWay();
System.out.println("其中一条路径如下:");
kt.PrintWay();
}
}//KnightTra Class
/*路径点的数据结构*/
class KData{
int x;
int y;
/*用坐标构建一个点*/
KData(int x,int y){
this.x=x;
this.y=y;
}
/*用已有对象构建一个点*/
KData(KData kd){
this.x=kd.x;
this.y=kd.y;
}
}
else if(maze[i-1][j-1].value==0&&maze[i-1][j-1].mark==1)//左上
{
maze[i-1][j-1].mark=0;
printf("->(%d,%d)",i+1,j+1);
if(i==m&&j==n)
{
printf("Success!");
exit(0);
}
path(p,i-1,j-1);
}
else if(maze[i-1][j+1].value==0&&maze[i-1][j-1].mark==1)//右上