题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int n;
int x[100];
int ans[11];
bool place(int k)
{
int i=1;
while(i<k)
{
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))
return false;
i++;
}
return true;
}
int main()
{
int k,cnt;
memset(ans,0,sizeof(ans));
while(scanf("%d",&n)!=EOF&&n!=0)
{
if(ans[n]>0) //需要预处理。
{
printf("%d\n",ans[n]);
continue;
}
x[1]=0;
k=1,cnt=0;
while(k>0)
{
x[k]++;
while(x[k]<=n&&place(k)==0)
{
x[k]++;
}
<span style="white-space:pre"> </span>//printf("%d %d\n",k,x[k]);
if(x[k]<=n)
{
if(k==n)
cnt++;
else
{
k++;
x[k]=0;
}
}
else
k--;
}
ans[n]=cnt;
printf("%d\n",cnt);
}
}
分析:
并没有想象中的那么简单。及其的复杂,这道题 个人感觉先找n=4计算,用把枚举的所有步骤写出来,再按照步骤写代码。
4
1 1 第一个棋子放在(1,1)时
2 3
3 5
2 4 不是(3,6)
3 2
4 5 不符合
3 5
2 5
1 2 第一个棋子放在(1,2)时
2 4
3 1
4 3 方案一
4 5 怎样能退到第一个棋子
3 5
2 5
1 3 第一个棋子放在(1,3)