USACO1.5 Checker Challenge(checker)

        本題是經典的n皇后問題,使用回溯法求解。第一次用一個for循環檢測當前位置是否和前面的皇后衝突,結果在最後一個測試例輸入13時,超時0.436s,後改用二維數組直接判斷,輸入13時僅用時0.562秒,再一次顯示學會利用空間換時間的重要性。ios

 

/*
ID:jzzlee1
PROG:checker
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<cmath>
#include<cstring>
using namespace std;
ifstream fin("checker.in");
ofstream fout("checker.out");
int n,ans,k,c[15],vis[30][30];
void search(int cur)
{
	int i;
	if(cur==n)							//遞歸邊界,若是走到這裏,全部皇后必然不衝突
	{
		ans++;
		if(k<3)							//打印前三組
		{
			//cout<<c[0]+1;
			fout<<c[0]+1;
			for(int i=1;i!=n;i++)
				fout<<" "<<c[i]+1;
				//cout<<" "<<c[i]+1;
			fout<<endl;
			//cout<<endl;
			k++;
		}
	}
	else
		for(i=0;i<n;i++)
		{
			if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])//直接利用二維數組判斷
			{
				c[cur]=i;
				vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;	//修改全局變量
				search(cur+1);
				vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;	//將全局變量的值改回來
			}
		}
}
int main()
{
	//cin>>n;
	fin>>n;
	memset(c,0,sizeof(c));
	search(0);
	fout<<ans<<endl;
	//cout<<ans<<endl;
	return 0;
}
相關文章
相關標籤/搜索