八皇后问题

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将 8 个皇后放在棋盘上(有8×8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即 a=b1b2...b8, 其中bi(1≤bi≤8)为相应摆法中第 i 行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。给出一个数n,要求输出第n个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入描述:
输入包含多组数据。

每组数据包含一个正整数n(1≤n≤92)。
输出描述:
对应每一组输入,输出第n个皇后串。
示例1
输入
1
92
输出
15863724
84136275


说实在的,看完题目后完全是蒙逼的,完全没有头绪要找到92个串是什么法子,92个耶!92个!

所以第一时间去看了别人是如何解得,再自己想一遍。

好几个高手的关键循环步骤都理解不了,终于看到一个小朋友的,用的深度循环遍历,这种我之前做递归的题的时候做过,终于看懂了,然而最后自己写一遍的时候check逻辑有点问题,最后重新对比了思路才发现了一个if的错误,代码中标出来。

通过这次题改变了我对编程的看法,因为我之前不怎么刷题,现在就积极的刷题想把基础不回来。

1.我一直以为每个题目不同之处在于使用了不同的算法或结构,所有我觉得知道了算法和一些数据结构的使用就能够轻松解题,

但是这次用的也是深度遍历,可是我却毫无头绪。

2.因此,我觉得,掌握算法和数据结构是为了更好的解题,更重要的是遇到问题时的逻辑思维,有了思维和步骤才能去用代码实现,在实现的过程中用优秀的算法优化时间和空间复杂度。

3.最后,现在应该做的,还是先多做不同类型的题目,了解不同算法的用法。在这过程中,有意识的训练自己的逻辑思维能力,解决问题的逻辑能力。

4.就好像我们程序员一样,只会用工具,没有自己的思想,思想都时总监之类的角色去设计了,所以为了脱离基本程序员这个角色,应该多去锻炼自己解决问题的逻辑思维。

代码附上:

// write your code here
import java.util.Scanner;
import java.util.Vector;


public class Main {
	static Vector<String> v = new Vector<String>();
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		 char[] arr = {'1', '2', '3', '4', '5', '6', '7', '8'};
		int[] pos = new int[8];
		StringBuffer current = new StringBuffer();
		while(sc.hasNext()) {
			int n = sc.nextInt();
			getValidQueen(arr,current,pos);
			System.out.println(v.elementAt(n-1));
		}
	}
	//判断方案是否是有效的,i,j是列,值是行
	public static boolean check(StringBuffer sb) {
		for (int i = 0; i < sb.length(); i++) {
			for (int j = i+1; j < sb.length(); j++) {
				//不是斜线和反斜线,同一行
				if(sb.charAt(i)-sb.charAt(j)==(i-j)||sb.charAt(j)-sb.charAt(i)==(i-j){这里原来我写成j-i的,这样和前面的逻辑就一样了}||
						sb.charAt(i)==sb.charAt(j)) {
					return false;
				}
				
			}
		}
		return true;
	}
	
	public static void getValidQueen(char[] arr,StringBuffer current,int[] pos) {
		//当前的current值符合条件
		if(current.length()==8&&check(current)==true) {
			v.addElement(current.toString());
			return;
		}
		
		for (int i = 0; i < arr.length; i++) {
			if(pos[arr[i]-'1']==1||check(current)==false)continue;
			current.append(arr[i]);
			pos[arr[i]-'1']=1;
			getValidQueen(arr, current, pos);
			pos[arr[i]-'1']=0;
			current.deleteCharAt(current.length()-1);
		}
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值