上次裸考蓝桥杯c++,只拿了个省三,遗憾无限~
这一次无论如何都要弥补一下,emmm,算是对我大学时光的纪念吧。。。
话不多说:蓝桥杯java重点
- 枚举以及优化
- 递归(回溯,剪枝):八皇后,全排列
- dfs ,bfs,二分查找
- 过程模拟//水题
- 枚举,搜索,模拟
- 动态规划 dp
- 并查集
枚举常见优化套路:
减少枚举变量
缩小枚举范围
二分查找
空间换时间:hash
下面是n皇后的java实现代码(没有优化):
import java.util.Arrays;
import java.util.Scanner;
public class dfs回溯八皇后 {
//回溯八皇后
final static int maxn=100;
static int queen[]=new int[maxn+5];//保存每一个皇后的位置
static int n;
static int num;//皇后数
static void init()
{
num=0;
Arrays.fill(queen,-1);
}
static boolean isOk(int x,int y)
{
for(int i=1;i<x;i++)//行
{
if(queen[i]==y||i-x==queen[i]-y||i-x==y-queen[i])
return false;
}
return true;
}
static void dfs(int x)
{
if(x>n)
{
num++;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(queen[i]==j)
System.out.print("q");
else
System.out.print(".");
}
System.out.println();
}
System.out.println();
}
else
{
for(int j=1;j<=n;j++)//遍历行的每个元素
{
if(isOk(x,j))
{
queen[x]=j;
dfs(x+1);
queen[x]=-1;//回溯
}
}
}
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
n=cin.nextInt();
init();//初始化
dfs(1);
System.out.println(num);
cin.close();
}
}