tyvj P1080 N皇后
lie[i]==false表示第i列还没有任何棋子;dui1[i]==false表示向右倾斜的、从上到下的第i条对角线上还没有任何棋子;dui2[i]==false表示向左倾斜的、从上到下的第i条对角线上还没有任何棋子。
利用这些记录优化搜索。
n==13的数据我用了403ms。
以下是我的代码:
#include
<
iostream
>
#include < string .h >
#define maxn 17
using namespace std;
long n,cnt,ans[maxn];
bool lie[maxn],dui1[ 2 * maxn],dui2[ 2 * maxn];
long f1( long x, long y)
{
return (x - y + n);
}
long f2( long x, long y)
{
return (x + y - 1 );
}
void dfs( long dep)
{
if (dep > n)
{
cnt ++ ;
if (cnt > 3 ) return ;
for ( long i = 1 ;i <= n;i ++ )
{
if (i != 1 ) cout << " " ;
cout << ans[i];
}
cout << endl;
return ;
}
for ( long i = 1 ;i <= n;i ++ )
if ( ! lie[i] &&! dui1[f1(dep,i)] &&! dui2[f2(dep,i)])
{
lie[i] = dui1[f1(dep,i)] = dui2[f2(dep,i)] = true ;
ans[dep] = i;
dfs(dep + 1 );
lie[i] = dui1[f1(dep,i)] = dui2[f2(dep,i)] = false ;
}
}
int main()
{
cin >> n;
cnt = 0 ;
memset(lie, false , sizeof (lie));
memset(dui1, false , sizeof (dui1));
memset(dui2, false , sizeof (dui2));
dfs( 1 );
cout << cnt << endl;
return 0 ;
}
#include < string .h >
#define maxn 17
using namespace std;
long n,cnt,ans[maxn];
bool lie[maxn],dui1[ 2 * maxn],dui2[ 2 * maxn];
long f1( long x, long y)
{
return (x - y + n);
}
long f2( long x, long y)
{
return (x + y - 1 );
}
void dfs( long dep)
{
if (dep > n)
{
cnt ++ ;
if (cnt > 3 ) return ;
for ( long i = 1 ;i <= n;i ++ )
{
if (i != 1 ) cout << " " ;
cout << ans[i];
}
cout << endl;
return ;
}
for ( long i = 1 ;i <= n;i ++ )
if ( ! lie[i] &&! dui1[f1(dep,i)] &&! dui2[f2(dep,i)])
{
lie[i] = dui1[f1(dep,i)] = dui2[f2(dep,i)] = true ;
ans[dep] = i;
dfs(dep + 1 );
lie[i] = dui1[f1(dep,i)] = dui2[f2(dep,i)] = false ;
}
}
int main()
{
cin >> n;
cnt = 0 ;
memset(lie, false , sizeof (lie));
memset(dui1, false , sizeof (dui1));
memset(dui2, false , sizeof (dui2));
dfs( 1 );
cout << cnt << endl;
return 0 ;
}