hdu2553
1951 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=2553
解析:テンプレートの問題ですが、うっかりTLEについてしまいましたので、表をつけるほうが安心です。
コード:
解析:テンプレートの問題ですが、うっかりTLEについてしまいましたので、表をつけるほうが安心です。
コード:
#include
#include
#include
#include
#include
#include
using namespace std;
#define MM -1000
int a[12]; //
int ans[12]; //
void init()
{
for(int i=0;i<12;i++) a[i]=MM;
}
bool valid(int row, int col, int e)
{
for (int i = 0; i < e; i++){
if (a[i] == col || abs(i - row) == abs(a[i] - col))
return false;
}
return true;
}
int queen(int e)
{
int cnt = 0;
int i = 0, j = 0;
while (i < e){
while (j < e){ // i ,
if(valid(i, j, e)) //
{
a[i] = j; // i
j = 0; // i , , j , 0
break;
}
else j++;
}
if(a[i] == MM){ // i
if (i == 0) break; // , , ,
else {
j = a[--i] + 1; //
a[i] = MM; // ,
continue;
}
}
if (i == e - 1) // , ,
{
cnt++;
j = a[i] + 1; //
a[i] = MM; //
continue;
}
i++;
}
return cnt;
}
void deal() // ,
{
for(int i=1;i<11;i++){
init();
ans[i]=queen(i);
}
}
int main()
{
freopen("in.txt","r",stdin);
deal();
int n;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
printf("%d
",ans[n]);
}
return 0;
}