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;
}
相关文章
相关标签/搜索