***6.22-八皇后问题

问题及代码:

/*   
*Copyright (c)2015,烟台大学计算机与控制工程学院   
*All rights reserved.   
*文件名称:Queen.java   
*作    者:单昕昕   
*完成日期:2015年10月9日   
*版 本 号:v1.0   
*   
*问题描述:列出八皇后问题的所有情况
*程序输入:无。
*程序输出:八皇后问题的所有情况。  
*/ 
import java.util.*;
import java.util.Scanner;
public class Test
{
    public final static int[][]map=new int[8][8];  //是否有皇后的标记数组
    public static int casenum=1;  //解决方案的个数
    public static void dfs(int row)  //列举出2种情况,从行入手
    {
    	int column;
        for (column=0; column<8; column++)  //依次列举八列
        {
           map[row][column]=1;  //标记皇后位置
            if (row==0||check(row,column)==0)
            {
                if (row<7)  //当行没有列举完的时候继续列举
                    dfs(row+1);  
                else  //列举到第八行后输出
                    print();
            }
            map[row][column]=0;  //取消标记
        }
    }
    public static int check(int row,int column)//检查行列对角线
    {
    	 int i;
    	 for (i=1; i<8; i++)
                    //本行之前的该列某一行有皇后(上) //本列之前的该行某一列有皇后(左)    //本列之后的该行某一列有皇后(右)   //左上对角线
 	        if((row-i>=0&&map[row-i][column]==1)||(column-i>=0&&map[row][column-i]==1)||(column+i<8&&map[row][column+i]==1)||(row-i>=0&&column-i>=0&&map[row-i][column-i]

==1)||(row-i>=0&&column+i<8&&map[row-i][column+i]==1))  //右上对角线
 	            return 1;
    	 return 0;
    }
    public static void print()//输出各种情况
    {
    	int i,j;
    	System.out.println("case:"+casenum);
    	++casenum;  //方案个数加一
    	for (i=0; i<8; i++)
        {
    		System.out.print("|");
            for (j=0; j<8; j++)
            {
                if (map[i][j]==1)  //有皇后用Q表示
                	System.out.print("Q|");
                else
                	System.out.print(" |");
            }
            System.out.println("\n");
        }
    	System.out.println("\n");
    }
    public static void main(String[] args)
    {
    	dfs(0); //从第一行开始
    }  
}

 

 

运行结果:





知识点总结:
DFS。

学习心得:

(⊙v⊙)嗯写了一晚上。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值