hdu N皇后问题 (简单DFS)

N皇后问题


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22171    Accepted Submission(s): 9887


Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input
1
8
5
0
 

Sample Output
1
92
10
 

Author
cgf
 

Source
2008 HZNU Programming Contest

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553

题目大意:经典的N皇后问题,同行同列同斜线上不能有两个皇后,求符合摆放条件的情况个数。(这题比较坑,在hdu上提交会超时,只能打表,所以先用DFS求出对应答案,再写打表代码来AC此题,具体打表代码就省略啦)


import java.util.*;

public class Main {
	
	public static int ans;
	public static int n;
	public static boolean[] vis = new boolean[12];        //判断同列上不能摆放皇后
	public static boolean[] vis_coSum = new boolean[20];   //左下到右上的斜边不能摆放,坐标和相等的在同一斜边上
	public static boolean[] vis_coDif = new boolean[40];   //左上到右下的斜边不能摆放,坐标差相等的在同一斜边上
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			n = sc.nextInt();
			if(n == 0){
				return ;
			}
			ans = 0;
			Arrays.fill(vis, false);               //初始化判断标志
			Arrays.fill(vis_coSum, false);
			Arrays.fill(vis_coDif, false);
			DFS(0);
			System.out.println(ans);
		}
	}
	
	public static void DFS(int x){
		if(x==n){     //成功摆放完一次ans加1
			ans++;
			return ;
		}
		for(int i=0;i< n;i++){
			int dif = x-i+20;
			if(!vis[i] && !vis_coSum[i+x] && !vis_coDif[dif]){   // 判断当前位置是否符合摆放条件
				vis[i] = vis_coSum[i+x] = vis_coDif[dif] = true;     //标记已摆放
				DFS(x+1);                                             //摆放下一行
				vis_coDif[dif] = vis_coSum[i+x] = vis[i] = false;     //返回过程取消标记
			}
		}
	}
	

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值