八皇后问题-循环实现
Java 当时
毕业设计时做的就是 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
count = count * size&;#59;
}
// 对每一个可能的情况
for ( i=0 &;#59; i // 计算这种情况下的棋盘上皇后的摆放位置,用 8 进制数表示
// 此处可优化
int temp = i&;#59;
for ( j=0 &;#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 for ( j=i+1 &;#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 System.out.print ( &;quot;(&;quot; + i + &;quot;,&;quot; + data + &;quot;) &;quot; )&;#59;
}
System.out.println ()&;#59;
}
public static void main(String args[]) {
(new Queen())pute( 8 )&;#59;
}
}
--------------------------------------------------------------------------------
zhuwei622 回复于:2005-12-23 14:42:45
data [j] = temp % size;//temp永远小于size
temp = temp / size;//temp不就等于0了?那还循环什么?循环这么多次赋值都一模一样
--------------------------------------------------------------------------------
huting974 回复于:2007-02-08 13:59:41
for ( j=i+1 &;#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是数组,怎么跟里面的元素比较???
--------------------------------------------------------------------------------
huting974 回