八皇后问题 java代码
2016-07-23 08:54
429 查看
具体的结果在tmp.txt文件里面
package test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class EightQueenDemo { private static final int MAX_NUM = 8; private static int[][] arr = new int[MAX_NUM][MAX_NUM]; private static int[] res = new int[MAX_NUM]; private static int index = 0; private static PrintWriter pw = null; private static Set<String> resSet = new HashSet<String>(); /** * 在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub initArr(); initStream(); show(); procedure(0); closeStream(); System.out.println("result = "+index); System.out.println("check distinct "+(resSet.size())); } private static void initArr() { for (int i = 0; i < MAX_NUM; i++) { for (int j = 0; j < MAX_NUM; j++) { arr[i][j] = 10 * i + 10 + j + 1; } } } private static void initStream() throws IOException { File file = new File("tmp.txt"); if (!file.exists()) { file.createNewFile(); }else { file.delete(); file.createNewFile(); } pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file))); } private static void closeStream() { if (pw != null) { pw.flush(); pw.close(); } } private static void show() { for (int i = 0; i < MAX_NUM; i++) { for (int j = 0; j < MAX_NUM; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } private static void show(int[] res) { System.out.println(Arrays.toString(res)); } private static boolean isSameCol(int res, int obj) { return (res % 10 == obj % 10) && obj > 0; } private static boolean isSameLine(int res, int obj) { return (res / 10 == obj / 10) && obj > 0; } // private static boolean isBias(int res, int obj) { // return ((res % 10 == res / 10) && (obj % 10 == obj / 10) || (res % 10 + // res / 10 == MAX_NUM + 1) // && (obj % 10 + obj / 10 == MAX_NUM + 1)) // && obj > 0; // } private static boolean isBias2(int res, int obj) { return ((res % 10 - res / 10 == obj % 10 - obj / 10) || (res % 10 + res / 10 == obj % 10 + obj / 10)) && obj > 0; } private static boolean isConflict(int res, int obj) { // boolean flag = isSameLine(res, obj) || isSameCol(res, obj) || // isBias2(res, obj); boolean flag = isSameLine(res, obj) || isBias2(res, obj) || isSameCol(res, obj); // System.out.println("flag="+flag+"&&res="+res+"||obj="+obj); return flag; } private static void isAccordCond(int arrInt, int line) { boolean isConflickFlag = false; for (int j = 0; j < line; j++) { if (isConflict(arrInt, res[j])) { isConflickFlag = true; break; } } if (!isConflickFlag) { res[line] = arrInt; if (line == MAX_NUM - 1) { // show(res); String str = Arrays.toString(res); // System.out.println(str); resSet.add(str); draw(res); index++; } else { line++; procedure(line); } } } private static void procedure(int line) { for (int i = 0; i < MAX_NUM; i++) { res[line] = 0; isAccordCond(arr[line][i], line); } } private static void draw(int[] res) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < MAX_NUM; i++) { for (int j = 0; j < MAX_NUM; j++) { if (checkNum(res, arr[i][j])) { sb.append(" @"); } else { sb.append(" $"); } } pw.println(sb.toString()); sb.delete(0, sb.length()); } pw.println(); pw.println("--------------------------------------------------------"); } private static boolean checkNum(int[] res, int obj) { boolean flag = false; for (int i = 0; i < MAX_NUM; i++) { if (obj == res[i]) { flag = true; break; } } return flag; } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树