会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将 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);
}
}
}