前回BlueBridge Cup C ++のベアテストを行ったときは、3回しか保存できなかったので、ごめんなさい。
今回はそれを補う必要があります、えーと、それは私の大学時代の記念です。。。
言うことはあまりありません:ブルーブリッジカップjavaのキーポイント
- 列挙と最適化
- 再帰(バックトラック、プルーニング):8つのクイーン、すべての順列
- dfs、bfs、バイナリ検索
- プロセスシミュレーション//水問題
- 列挙、検索、シミュレーション
- 動的プログラミングdp
- そして収集する
一般的な最適化ルーチンを列挙します。
列挙変数を減らす
列挙範囲を縮小する
バイナリ検索
時間のスペース:ハッシュ
以下は、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();
}
}