免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4393 | 回复: 4
打印 上一主题 下一主题

八皇后问题-循环实现 Java [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2002-09-11 14:15 |只看该作者 |倒序浏览
当时毕业设计时做的就是 n 皇后问题在分布式环境下的实现。

把简单的演示代码贴过来大家看看:

/*
* 8皇后问题:
*
* 问题描述:
* 在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相冲突
*(在每一横列,竖列,斜列只有一个皇后)。
*
* 数据表示:
* 用一个 8 位的 8 进制数表示棋盘上皇后的位置:
* 比如:45615353 表示:
*       第0列皇后在第4个位置
*       第1列皇后在第5个位置
*       第2列皇后在第6个位置
*       。。。
*       第7列皇后在第3个位置
*
* 循环变量从 00000000 加到 77777777 (8进制数)的过程,就遍历了皇后所有的情况
* 程序中用八进制数用一个一维数组 data[] 表示
*
* 检测冲突:
*     横列冲突:data == data[j]
*     斜列冲突:(data+i) == (data[j]+j) 或者 (data-i) == (data[j]-j)
*
* 好处:
* 采用循环,而不是递规,系统资源占有少
* 可计算 n 皇后问题
* 把问题线性化处理,可以把问题分块,在分布式环境下用多台计算机一起算。
*
* ToDo:
*   枚举部分还可以进行优化,多加些判断条件速度可以更快。
*   输出部分可以修改成棋盘形式的输出
*
* @author cinc 2002-09-11
*
*/

public class Queen {
    int size&#59;
    int resultCount&#59;
   
    public void compute ( int size ) {
        this.size = size&#59;
        resultCount = 0&#59;
        int data[] = new int[size]&#59;
        int count&#59; // 所有可能的情况个数
        int i,j&#59;
        
        // 计算所有可能的情况的个数
        count = 1&#59;
        for ( i=0 &#59; i<size &#59; i++ ) {
            count = count * size&#59;
        }
        // 对每一个可能的情况
        for ( i=0 &#59; i<count &#59; i++ ) {
            // 计算这种情况下的棋盘上皇后的摆放位置,用 8 进制数表示
            // 此处可优化
            int temp = i&#59;
            for ( j=0 &#59; j<size &#59; j++ ) {
                data [j] = temp % size&#59;
                temp = temp / size&#59;
            }
            // 测试这种情况是否可行,如果可以,输出
            if ( test(data) )
                output( data )&#59;
        }
    }

    /*
     * 测试这种情况皇后的排列是否可行
     *
     */
    public boolean test( int[] data ) {
        int i,j&#59;
        for ( i=0 &#59; i<size &#59; i++ ) {
            for ( j=i+1 &#59; j<size &#59; j++ ) {
                // 测试是否在同一排
                if ( data == data[j] )
                    return false&#59;
                // 测试是否在一斜线
                if ( (data+i) == (data[j]+j) )
                    return false&#59;
                // 测试是否在一反斜线
                if ( (data-i) == (data[j]-j) )
                    return false&#59;
            }
        }
        return true&#59;
    }

    /*
     * 输出某种情况下皇后的坐标
     *
     */
    public void output ( int[] data ) {
        int i&#59;
        System.out.print ( ++resultCount + &quot;: &quot; )&#59;
        for ( i=0 &#59; i<size &#59; i++ ) {
            System.out.print ( &quot;(&quot; + i + &quot;,&quot; + data + &quot &quot; )&#59;
        }
        System.out.println ()&#59;
    }
    public static void main(String args[]) {
        (new Queen()).compute( 8 )&#59;
    }
}

论坛徽章:
0
2 [报告]
发表于 2005-12-23 14:42 |只看该作者

明显有问题啊!!!!

data [j] = temp % size;//temp永远小于size
temp = temp / size;//temp不就等于0了?那还循环什么?循环这么多次赋值都一模一样

论坛徽章:
0
3 [报告]
发表于 2007-02-08 13:59 |只看该作者
for ( j=i+1 &#59; j<size &#59; j++ ) {
                // 测试是否在同一排
                if ( data == data[j] )
                    return false&#59;
                // 测试是否在一斜线
                if ( (data+i) == (data[j]+j) )
                    return false&#59;
                // 测试是否在一反斜线
                if ( (data-i) == (data[j]-j) )
                    return false&#59;
            }


这段是什么意思啊?data是数组,怎么跟里面的元素比较???

论坛徽章:
0
4 [报告]
发表于 2007-02-08 14:05 |只看该作者
public class Queen8{

  static final int QueenMax = 8;
  static int oktimes = 0;
  static int chess[] = new int[QueenMax];//每一个Queen的放置位置


  public static void main(String args[]){
    for (int i=0;i<QueenMax;i++)chess[i]=-1;
    placequeen(0);
    System.out.println("\n\n\n八皇后共有"+oktimes+"个解法");
  }


  public static void placequeen(int num){ //num 为现在要放置的行数
    int i=0;
    boolean qsave[] = new boolean[QueenMax];
    for(;i<QueenMax;i++) qsave[i]=true;
   
    //下面先把安全位数组完成
    i=0;//i 是现在要检查的数组值
    while (i<num){
      qsave[chess[i]]=false;
      int k=num-i;
      if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) qsave[chess[i]+k]=false;
      if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) qsave[chess[i]-k]=false;
      i++;
    }
    //下面历遍安全位
    for(i=0;i<QueenMax;i++){
      if (qsave[i]==false)continue;
      if (num<QueenMax-1){
        chess[num]=i;
        placequeen(num+1);
      }
      else{ //num is last one
      chess[num]=i;
      oktimes++;
      System.out.println("这是第"+oktimes+"个解法 如下:");
      System.out.println("第n行:   1  2  3  4  5  6  7  8");
      
      for (i=0;i<QueenMax;i++){
       String row="第"+(i+1)+"行:  ";
       if (chess[i]==0);
       else
        for(int j=0;j<chess[i];j++) row+=" 0 ";
        row+=" 1 ";
        int j = chess[i];
        while(j<QueenMax-1){row+=" 0 ";j++;}
       System.out.println(row);
      }
      }
    }
  //历遍完成就停止
  }
}

论坛徽章:
0
5 [报告]
发表于 2007-04-16 22:14 |只看该作者
&#59 是什么意思啊???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP