public class EightGir {
static int count=0;//记录第几个棋盘
static int n = 8;//棋盘维度
public static void main(String[] args) {
//创建棋盘
int[][] arrays = new int[n][n];
//赋值
for (int i = 0;i<n;i++){
for (int j =0;j<n;j++){
arrays[i][j]=0;
}
}
EightGir eightGir = new EightGir();
eightGir.putChess(arrays,0);
}
//放棋子的方法 arrays是传进去的数组,row是行,每次都是按行下棋的
public void putChess(int[][] arrays,int row){
; //复制一个新数组用于输出,否则会影响上一种数组
if (row==n){//表示下完最后一行
count++;
System.out.println("第"+count+"种棋盘是=====");
for (int i = 0;i<n;i++){
for (int j =0;j<n;j++){
System.out.print(arrays[i][j]+"\t");
}
System.out.println();
}
}else {
for (int i=0;i<n;i++){ //不用判断棋子在不在同一行,因为每次都是按行下的。
if(!checkWay(arrays,row,i)){
for (int j=0;j<n;j++){
arrays[row][j]=0; //将这一行清0
}
arrays[row][i]=1;
putChess(arrays,row+1);
}
}
}
}
//判断条件是否符合条件
public boolean checkWay(int[][] arrays,int row,int col){
for (int i=0;i<row;i++){ //因为是按行下的,所以只需要检查当前行之前的列是否符合条件
if (arrays[i][col]==1){
return true; //表示这一列被下过了
}
for (int j=0;j<n;j++){
if (((i+j==row+col)||(i-j==row-col))&&arrays[i][j]==1){//斜率相同 x+y或者x-y都是相同的表示在同一斜率上
return true;
}
}
}
return false;
}
}
改进
public class EightGirl2 {
int max = 8;//维度
int count=0;
int[] arrays = new int[max];
public static void main(String[] args) {
EightGirl2 demo = new EightGirl2();
demo.putChess(0);
System.out.println(demo.count);
}
public void putChess(int n){
if(n==8){
count++;
print();
System.out.println();
return;
}else{
for (int i =0;i<max;i++){ //表示当前行一列一列的放
arrays[n]=i;
if (checkChess(n)){
putChess(n+1);
}
//如果冲突则会为当前行重新赋值新的i;
}
}
}
//n为下标,也代表行
public boolean checkChess(int n){
for (int i=0;i<n;i++){
if (arrays[i]==arrays[n]||Math.abs(n-i)==Math.abs(arrays[n]-arrays[i])){
return false;
}
}
return true;
}
public void print(){
for(int i =0;i<arrays.length;i++){
System.out.print(arrays[i]+"\t");
}
}
}