————————————————————————————————————————————
AC代码1:
//2553
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int q[10][10];
int dir[4][2] = {1, 1, 1, -1, -1, 1, -1, -1};
int N;
int ans;
int res[11];
bool Q(int n)
{
if (!n)
{
ans++;
return true;
}
int X, Y;
int flag = 0;
int i = N - n;
for (int j=0; j<N; j++)
{
q[i][j] = n;
for (int u=0; u<N; u++)
{
if (q[i][u] && (u != j))
{
flag = 1;
break;
}
if ((q[u][j]) && (u != i))
{
flag = 1;
break;
}
for (int v=0; v<4; v++)
{
if (!u)
{
break;
}
X = i+u*dir[v][0];
Y = j+u*dir[v][1];
if (q[X][Y] && (X < N) && (Y < N) && (X >= 0) && (Y >= 0))
{
flag = 1;
break;
}
}
if (flag)
{
break;
}
}
if (flag)
{
flag = 0;
q[i][j] = 0;
if (j==N-1)
{
return false;
}
continue;
}
else
{
Q(n-1);
q[i][j] = 0;
if (j == N-1)
{
return false;
}
}
}
}
int main()
{
int n;
for (int i=1; i<=10; i++)
{
ans = 0;
N = i;
Q(i);
res[i] = ans;
}
while (cin >> n)
{
if (!n)
{
break;
}
cout << res[n] << endl;
}
return 0;
}
AC代码2:
//2553
#include <iostream>
#include <cstring>
using namespace std;
int dir[4][2] = {1, 1, 1, -1, -1, 1, -1, -1};
int ans = 0;
int q[10][10];
int flag;
int X, Y;
int res[11];
bool Q(int x, int y, int n)
{
if (x == n)
{
ans++;
return true;
}
while (1)
{
q[x][y] = 1;
flag = 0;
for (int u=0; u<n; u++)
{
if (q[x][u] && (u != y))
{
flag = 1;
break;
}
if ((q[u][y]) && (u != x))
{
flag = 1;
break;
}
for (int v=0; v<4; v++)
{
if (!u)
{
break;
}
X = x+u*dir[v][0];
Y = y+u*dir[v][1];
if (q[X][Y] && (X < n) && (Y < n) && (X >= 0) && (Y >= 0))
{
flag = 1;
break;
}
}
if (flag)
{
break;
}
}
if (flag)
{
flag = 0;
q[x][y] = 0;
y++;
if (y >= n)
{
return false;
}
continue;
}
X = x+1;
Y = 0;
Q(X, Y, n);
q[x][y] = 0;
y++;
if (y >= n)
{
return false;
}
continue;
}
}
int main()
{
for (int i=1; i<11; i++)
{
ans = 0;
memset(q, 0, sizeof(q));
Q(0, 0, i);
res[i] = ans;
}
int n;
while (cin >> n)
{
if (!n)
{
break;
}
cout << res[n] << endl;
}
return 0;
}
AC代码3:
#include <iostream>
using namespace std;
int main()
{
int n;
int res[10] = {1, 0, 0 ,2, 10, 4, 40, 92, 352, 724};
while ((cin >> n) && n)
{
cout << res[n-1] << endl;
}
return 0;
}
有没有记忆化数组就是过题的关键,啊, 据说他可能一直给你10这个数据来测,然后就超时了,,,不懂里面的机理, 就当经验Σ(っ °Д °;)っ