热门文章
阿标在线 动力3.62HTML生成3.62网站文件说明
动力3.62整合动网7.0 SP2插
MDAC2.8 下载!
动力3.62版 防止垃圾留言
动力3.6全方位改动方法
让3.62不同频道实现不同风
把3.62首页登陆为横向代码
动易3.6首页随机FLASH修改
362首页和文章频道页图文幻
个性化修改3.6宝典
3.62轻易实现网摘功能
如何正确统计中文字数?
弹出JAVASCRIPT语法错误对
后台使“网站顶部LOGO地址
最新图片文章横向移动的修
html 生成艺术字
3.6 Sp2 Logo和Banner及广
日期值的计算
汉字转拼音
首页“图片更新”图片滚动
简体中文转换为繁体中文的
如何在css中定义链接的下划
情人碰面的问题.JAVA代码
[ 录入:阿标 | 点击数: | 更新时间:2005-3-12 9:24:00]
/*
* 8情人问题:
*
* 问题描述:
* 在一个8×8的棋盘里放置8个情人,要求每个情人两两之间不相冲突
*(在每一横列,竖列,斜列只有一个情人)。
*
* 数据表示:
* 用一个 8 位的 8 进制数表示棋盘上情人的位置:
* 比如:45615353 表示:
* 第0列情人在第4个位置
* 第1列情人在第5个位置
* 第2列情人在第6个位置
* 。。。
* 第7列情人在第3个位置
*
* 循环变量从 00000000 加到 77777777 (8进制数)的过程,就遍历了情人所有的情况
* 程序中用八进制数用一个一维数组 data[] 表示
*
* 检测冲突:
* 横列冲突:data[i] == data[j]
* 斜列冲突:(data[i]+i) == (data[j]+j) 或者 (data[i]-i) == (data[j]-j)
*
* 好处:
* 采用循环,而不是递规,系统资源占有少
* 可计算 n 情人问题
* 把问题线性化处理,可以把问题分块,在分布式环境下用多台计算机一起算。
*
* ToDo:
* 枚举部分还可以进行优化,多加些判断条件速度可以更快。
* 输出部分可以修改成棋盘形式的输出
*
* @author cinc 2002-09-11
*
*/
public class Queen {
int size;
int resultCount;
public void compute ( int size ) {
this.size = size;
resultCount = 0;
int data[] = new int[size];
int count; // 所有可能的情况个数
int i,j;
// 计算所有可能的情况的个数
count = 1;
for ( i=0 ; i<size ; i++ ) {
count = count * size;
}
// 对每一个可能的情况
for ( i=0 ; i<count ; i++ ) {
// 计算这种情况下的棋盘上情人的摆放位置,用 8 进制数表示
// 此处可优化
int temp = i;
for ( j=0 ; j<size ; j++ ) {
data [j] = temp % size;
temp = temp / size;
}
// 测试这种情况是否可行,如果可以,输出
if ( test(data) )
output( data );
}
}
/*
* 测试这种情况情人的排列是否可行
*
*/
public boolean test( int[] data ) {
int i,j;
for ( i=0 ; i<size ; i++ ) {
for ( j=i+1 ; j<size ; j++ ) {
// 测试是否在同一排
if ( data[i] == data[j])
return false;
// 测试是否在一斜线
if ( (data[i]+i) == (data[j]+j) )
return false;
// 测试是否在一反斜线
if ( (data[i]-i) == (data[j]-j) )
return false;
}
}
return true;
}
/*
* 输出某种情况下情人的坐标
*
*/
public void output ( int[] data ){
int i;
System.out.print ( ++resultCount + ": " );
for ( i=0 ; i<size ; i++ ) {
System.out.print ( "(" + i + "," + data[i] + " " );
}
System.out.println ();
}
//main()就是在这里.
public static void main(String args[]) {
(new Queen()).compute( 8 );
}
}