您的位置:首页 > 编程语言 > Java开发

八皇后问题 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