蓝桥杯竞赛知识点总结 距离蓝桥杯10天,附八皇后java代码实现(dfs 回溯)

上次裸考蓝桥杯c++,只拿了个省三,遗憾无限~

这一次无论如何都要弥补一下,emmm,算是对我大学时光的纪念吧。。。

话不多说:蓝桥杯java重点

  1. 枚举以及优化
  2. 递归(回溯,剪枝):八皇后,全排列
  3. dfs ,bfs,二分查找
  4. 过程模拟//水题
  5. 枚举,搜索,模拟
  6. 动态规划 dp
  7. 并查集

枚举常见优化套路:

减少枚举变量

缩小枚举范围

二分查找

空间换时间: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();
	}

}

 

猜你喜欢

转载自blog.csdn.net/Look_star/article/details/88556520