ブルーブリッジカップから10日後のブルーブリッジカップコンペティションの知識ポイントの要約、8つのクイーンJavaコードの実装(dfsバックトラック)

前回BlueBridge Cup C ++のベアテストを行ったときは、3回しか保存できなかったので、ごめんなさい。

今回はそれを補う必要があります、えーと、それは私の大学時代の記念です。

言うことはあまりありません:ブルーブリッジカップjavaのキーポイント

  1. 列挙と最適化
  2. 再帰(バックトラック、プルーニング):8つのクイーン、すべての順列
  3. dfs、bfs、バイナリ検索
  4. プロセスシミュレーション//水問題
  5. 列挙、検索、シミュレーション
  6. 動的プログラミングdp
  7. そして収集する

一般的な最適化ルーチンを列挙します。

列挙変数を減らす

列挙範囲を縮小する

バイナリ検索

時間のスペース:ハッシュ

 

以下は、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