标签:ati lse pac count new t set his col 路径
package my_mian_shi;
/**
*
*
*
* @author Administrator
*
*/
public class GameMain {
class TwoInteger{
public Integer column;
public Integer row;
}
boolean noFullPath=true;//判断是否 没有找到全路径
Integer column; //列
Integer row; //行
int []notExistPot; //不能存在的点
boolean [][] passedPot; //已经经过的点(以二维的方式表示某个方格)
Integer []path; //点的路径( 每一个数值表示 从左到右、从上到下、从0开始、给方块编号 )
TwoInteger ti = new TwoInteger();//用于进行一维转二维
public GameMain(Integer row,Integer column,int []notEP){
this.notExistPot=notEP;
if(column != null && column>0 && row != null && row > 0)
{
this.column=column;
this.row=row;
passedPot =new boolean[row][column];
path = new Integer[row*column-notExistPot.length];
}else {
throw new RuntimeException("列或行出现问题");
}
}
//判断为单一边界
public boolean decideSingleBounds(int bounds,int singleBounds) {
if((bounds & singleBounds)==0) return false;
else return true;
}
//设置passedPot和path
public void setPassedPotAndPath(int p,int a, boolean b) {
path[p]=a;
setPassedPot(a, b);
}
//设置passedPot和path
public void setPassedPotAndPath(int p,int a) {
path[p]=a;//入口
setPassedPot(a, true);
}
//判断是否在边界(组合)
public int decideBounds(int row ,int column) {
int count=0;
if(row==0) count += 1;//上边界
else if(row==this.row-1) count += 2; // 下边界
else if(column==0) count += 4; //左边界
else if(column==this.column-1) count += 8; //右边界
return count;
}
//判断是否在边界(组合)
public int decideBounds(int pot) {
int count=0;
if (pot<column) count += 1;
if ((pot-(row-1)*column)>=0 && (pot-(row-1)*column)<column) count += 2;
if (pot%column==0) count += 4;
if (pot%column==column-1) return count += 8;
return count;
}
//判断一维到二维数组是否越界
public boolean passedPotIndexOutOfBounds(int a) {
return a<0 || a>=column*row;
}
//判断多个数是否存在越界
public boolean passedPotIndexOutOfBounds(int []a) {
for(int i:a)
if(passedPotIndexOutOfBounds(i))
return true;
return false;
}
//二维转一维
public int twoToOne(int row,int column) {
return (row)*this.column+column;
}
//一维转二维
public void oneToTwo(int pot) {
int a=((pot+1)%column)-1;
ti.column = (a == -1) ? column-1 : a;
ti.row = pot/column;
//System.out.println(ti.row+" "+ti.column);
}
//打印路径
public void showPath() {
for(int i=0;i<path.length;i++) {
System.out.print(path[i]+" ");
}
}
//判断点是否存在
public boolean notExistPot(Integer pot) {
for(int i=0;i<notExistPot.length;i++) {
if(pot==notExistPot[i])
return true;
}
return false;
}
//点是否已经被经过
public boolean passedPot(Integer pot) {
oneToTwo(pot);
return this.passedPot[ti.row][ti.column];
}
//判断点是否是不存在的点或者已经过的点
public boolean passedPotOrNotExistPot(int a) {
return this.notExistPot(a) || this.passedPot(a);
}
// 回溯法递归遍历 求哈密顿通路 的一个解
public void run(int nowPosition){
boolean flag=false;
int a = path[nowPosition];
if (nowPosition==this.path.length-1) {
this.noFullPath=false;
}
//左边是否可以走
if (this.noFullPath
&&!this.decideSingleBounds(this.decideBounds(a), 4) //不能在左边界
&&!this.passedPotIndexOutOfBounds(a-1) //不能越界
&& !this.passedPotOrNotExistPot(a-1) //不能是已经经过的点和不能是不存在的点
) {
this.setPassedPotAndPath(nowPosition+1,a-1);
run(nowPosition+1);
flag=true;
}
if(flag) {
setPassedPot(a-1,false);
flag=false;
}
//右边是否可以走
if(this.noFullPath
&&!this.decideSingleBounds(this.decideBounds(a), 8)
&&!this.passedPotIndexOutOfBounds(a+1)
&& !this.passedPotOrNotExistPot(a+1)) {
this.setPassedPotAndPath(nowPosition+1,a+1);
run(nowPosition+1);
flag=true;
}
if(flag) {
setPassedPot(a+1,false);
flag=false;
}
//上边是否可以走
if(this.noFullPath
&&!this.decideSingleBounds(this.decideBounds(a), 1)
&&!this.passedPotIndexOutOfBounds(a-column)
&& !this.passedPotOrNotExistPot(a-column)) {
this.setPassedPotAndPath(nowPosition+1,a-column);
run(nowPosition+1);
flag=true;
}
if(flag) {
setPassedPot(a-column,false);
flag=false;
}
//下边是否可以走
if(this.noFullPath
&&!this.decideSingleBounds(this.decideBounds(a), 2)
&&!this.passedPotIndexOutOfBounds(a+column)
&& !this.passedPotOrNotExistPot(a+column)) {
this.setPassedPotAndPath(nowPosition+1,a+column);
run(nowPosition+1);
flag=true;
}
if(flag) {
setPassedPot(a+column,false);
flag=false;
}
}
//设置PassedPot的值
public void setPassedPot(int a, boolean b) {
this.oneToTwo(a);
this.passedPot[ti.row][ti.column]=b;
}
public static void main(String[] args) {
GameMain gm = new GameMain(5,6,new int[] {3,4,5,26,21}) ;
/*
for(int i=0;i<30;i++) {
System.out.print(i+" ");
gm.oneToTwo(i); // 测试一维转二维
}
*/
/*
for(int i=0;i<30;i++) {
System.out.print(i+" ");
System.out.println(gm.decideBounds(i));//测试边界范围是否正确
}
*/
/*
for(int i=1;i<16;i++) { //测试将组合边界转化为单边界
System.out.print(gm.decideSingleBounds(i, 1)+" ");
System.out.print(gm.decideSingleBounds(i, 2)+" ");
System.out.print(gm.decideSingleBounds(i, 4)+" ");
System.out.print(gm.decideSingleBounds(i, 8)+" ");
System.out.println();
}
*/
/*
for(int i=0;i<5;i++)
for(int j=0;j<6;j++) {
System.out.print(gm.twoToOne(i, j) +" ");
}
*/
gm.setPassedPotAndPath(0, 13);//设置入口
gm.run(0);
gm.showPath();
}
}
标签:ati lse pac count new t set his col 路径
原文地址:https://www.cnblogs.com/math-and-it/p/9898869.html