Feng.Li's Java See

抓紧时间,大步向前。
随笔 - 95, 文章 - 4, 评论 - 58, 引用 - 0
数据加载中……

人工智能八数码算法

public class BaShuMa {
 
 static int[][] chu = {{2,8,3},{1,6,4},{7,0,5}};
 static int[][] biao = {{1,2,3},{8,0,4},{7,6,5}};
 static int[][] now = chu;
 static int i0 =2;
 static int j0 =1;
    static int bushu = 0;
     boolean left = false;
  boolean right = false;
  boolean up = false;
  boolean down = false;
 
 

 
 static String lujing = "";
      
 /*返回当前数组的在位数*/
 public static int buzaiwei(int a[][]) {
  int sum = 0;
  for(int i=0;i<=2;i++) {
   for(int j=0;j<=2;j++) {
    if(a[i][j] == biao[i][j]&&a[i][j]!=0) {
     sum++;
    }
    
    }
   }
   return sum;
  }
 /*判断0所在的位置*/ 
  public void i0j0weizhi(int[][] a) {
   int[] b = new int[2];
   for(int i=0;i<=2;i++) {
    for(int j=0;j<=2;j++) {
     if(a[i][j]==0) {
      i0 = i;
      j0 = j;
      b[0] = i0;
      b[1] = j0;
      
                }
    }
   }
   
  }
  
 /*以当前数组的i0.j0为参数,求出当前的可用规则集,并用4个boolean值来防止逆操作*/
 public  String keyonggueizeji(int c,int d) {
  
  String keyonggueize = "";
  if(d>=1&&right==false) {
   keyonggueize = keyonggueize + "z";
   
  }
  if(c>=1&&down==false) {
   keyonggueize = keyonggueize + "s";
   
  }
  if(d<=1&&left==false) {
   keyonggueize = keyonggueize + "y";
   
  }
  if(c<=1&&up==false) {
   keyonggueize = keyonggueize + "x";
   
  }
  return keyonggueize;
}   /*走步函数*/
    public void zoubu(int c,int d) {
    
   int k1 = 0;
   int k2 = 0;
   int k3 = 0;
   int k4 = 0;
   int[][] b1={{2,8,3},{1,6,4},{7,0,5}};
   int[][] b2={{2,8,3},{1,6,4},{7,0,5}};
   int[][] b3={{2,8,3},{1,6,4},{7,0,5}}; 
  int[][] b4={{2,8,3},{1,6,4},{7,0,5}};
  for(int i=0;i<=2;i++) {
   for(int j=0;j<=2;j++) {
    b1[i][j]=now[i][j];
   }
  }
  for(int i=0;i<=2;i++) {
   for(int j=0;j<=2;j++) {
    b2[i][j]=now[i][j];
   }
  }
  for(int i=0;i<=2;i++) {
   for(int j=0;j<=2;j++) {
    b3[i][j]=now[i][j];
   }
  }
  for(int i=0;i<=2;i++) {
   for(int j=0;j<=2;j++) {
    b4[i][j]=now[i][j];
   }
  }
 
  /*int[][] b1 = {{2,8,3},{1,6,4},{7,0,5}};
   int[][] b2 = {{2,8,3},{1,6,4},{7,0,5}};
   int[][] b3 = {{2,8,3},{1,6,4},{7,0,5}}; 
  int[][] b4 = {{2,8,3},{1,6,4},{7,0,5}};*/
  i0j0weizhi(now);
  /*System.out.println(i0);
  System.out.println(j0);
  for(int a=0;a<=2;a++) {
             for(int b=0;b<=2;b++) {
              System.out.println(now[a][b]);
             }
            }*/

 
 
  /*判断是否在字符串里有z*/
 
 if(keyonggueizeji(i0,j0).indexOf("z")!=-1) {
  
    
   
  
  b1[i0][j0] = b1[i0][j0-1];
  b1[i0][j0-1] = 0;
     k1 = buzaiwei(b1); 
 
}

 if(keyonggueizeji(i0,j0).indexOf("s")!=-1) {
  b2[i0][j0] = b2[i0-1][j0];
  b2[i0-1][j0] = 0;
  k2 =buzaiwei(b2);
}
 
 if(keyonggueizeji(i0,j0).indexOf("y")!=-1) {
  b3[i0][j0] = b3[i0][j0+1];
  b3[i0][j0+1] = 0;
  k3 = buzaiwei(b3);
}
 
 if(keyonggueizeji(i0,j0).indexOf("x")!=-1) {
  b4[i0][j0] = b4[i0+1][j0];
  b4[i0+1][j0] = 0;
     k4 =buzaiwei(b4);
}
    if(k1>k2&&k1>k3&&k1>k4) {
  bushu++;
  lujing = lujing + "左";
  j0 = j0 -1;
  now = b1;
  left = true;
  up = false;
  down = false;
  right = false;
  /*for(int a=0;a<=2;a++) {
             for(int b=0;b<=2;b++) {
              System.out.println(now[a][b]);
             }*/
  
 }

 if(k2>k1&&k2>k3&&k2>k4) {
  bushu++;
  lujing = lujing + "上";
  i0 = i0 - 1;
  now = b2;
  left = false;
  up = true;
  down = false;
  right = false;
 
 }
 if(k3>k1&&k3>k2&&k3>k4) {
  bushu++;
  lujing = lujing + "右";
  j0 = j0 +1;
  now = b3;
  left = false;
  up = false;
  down = false;
  right = true;
 
 }
 if(k4>k1&&k4>k2&&k4>k3) {
  bushu++;
  lujing = lujing + "下";
  i0 = i0 + 1;
  now = b4;
  left = false;
  up = false;
  down = true;
  right = false;
  
 }
 if(k1==k2&&k1>k3&&k1>k4) {
  bushu ++;
  lujing = lujing + "上";
     i0 = i0 - 1;
  now = b2;
  left = false;
  up = true;
  down = false;
  right = false;
 
  
   

 }
}

 

 


    public static void main(String[] args) {
        BaShuMa bashuma = new BaShuMa();
        System.out.println("给定的初始状态数组为:");
     for(int i=0;i<=2;i++) {
      
       System.out.print(chu[0][i]);
      
     }
     System.out.println();
     for(int i=0;i<=2;i++) {
          System.out.print(chu[1][i]);
        }
        System.out.println();
     for(int i=0;i<=2;i++) {
      System.out.print(chu[2][i]);
      }
      System.out.println();
        System.out.println("***********************");
          System.out.println("给定的目标状态数组为:");
     for(int i=0;i<=2;i++) {
      
       System.out.print(biao[0][i]);
      
     }
     System.out.println();
     for(int i=0;i<=2;i++) {
          System.out.print(biao[1][i]);
        }
        System.out.println();
     for(int i=0;i<=2;i++) {
      System.out.print(biao[2][i]);
      }
        System.out.println();
        System.out.println("***********************");
        System.out.println("行走步骤为:");
        while(true)
        if(bashuma.buzaiwei(now)!=8) {
         bashuma.zoubu(i0,j0);
            for(int i=0;i<=2;i++) {
      
       System.out.print(now[0][i]);
      
     }
     System.out.println();
     for(int i=0;i<=2;i++) {
          System.out.print(now[1][i]);
        }
        System.out.println();
     for(int i=0;i<=2;i++) {
      System.out.print(now[2][i]);
      }
     
        System.out.println();
        System.out.println("***********************");
    }
        else {
         break;
        }
    System.out.println("走步的路线为:"+lujing);
    System.out.println("需要的步数为:"+bushu); 
        //bashuma.zoubu(i0,j0);
        //System.out.println(bashuma.alldepth(chu));
       
    }
}

posted on 2006-12-14 18:00 小锋 阅读(1894) 评论(1)  编辑  收藏 所属分类: algorithm

评论

# re: 人工智能八数码算法[未登录]  回复  更多评论   

博主 我想求一个八数码游戏的原代码
要求如下:
8个编有数码1~8的滑牌,能在3×3的井字格中滑动。井字格中有一格是空格,用0表示,因而空格周围的数码滑牌都可能滑到空格中去,如下图所示。
2 8 3
1 6 4
7 0 5

目标布局如下:
1 2 3
4 5 6
7 8 0

编制该游戏,要求:
 游戏开始时,随机产生一个布局。
 使用鼠标操纵方格的移动。
 也可以使用键盘操纵,比如使用数字键1~8分别控制方块1~8的移动。
 点击不能移动的方格要给出适当的提示。
是个初学者,完全菜鸟级。这个程序急需,希望博主看到后,施个援手吧
2008-01-08 11:01 | 菜鸟

只有注册用户登录后才能发表评论。


网站导航: