ACM2553网址:http://acm.hdu.edu.cn/showproblem.php?pid=2553
原题:
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
对于此题,我的解法是定义一个皇后的自定义结构,里面的参数X、Y分别带别它们在X轴和Y轴的坐标,以坐标来判断皇后的位置是否合法。虽然代码能运行,结果也正确,但是在ACM网站里提交却因为超时而失败了,所以想请问一下各位的前辈,对于我这个思路的算法,有没有办法优化,使它能提交成功
#include<stdio.h>
#include <stdlib.h>
struct Queen
{
int X;
int Y;
};
int Judge(struct Queen RQueen[],int N,int J)//判断皇后是否重复,是,返回-1;否,返回0
{
int QiPanX[11] = {0,0,0,0,0,0,0,0,0,0,0};
int i,k;
int X;int Y;
if(N ==1)
{
return 0;
}
for(i = 1;i<N+1;i++)//列重复
{
if((RQueen[i].X== QiPanX[RQueen[i].X])&&RQueen[i].X!=0&&RQueen[i].Y!=0)
{
return -1;
}
else{
QiPanX[RQueen[i].X]=RQueen[i].X;
}
}
for(i =N-1;i>=1;i--)//斜角重复
{
X =abs(RQueen[N].X - RQueen[i].X);
Y = abs(RQueen[N].Y - RQueen[i].Y);
if(X==Y)
{
return -1;
}
}
return 0;
}
int main(){
Queen RQueen[11]; //下标0不使用
int result[11];
int Judge1;
int i,light1;
int N,sum;
sum = 0;
for(i =0;i<11;i++)//初始化
{
result[i] = 0;
}
scanf("%d",&N);
while(N!=0)
{
if(result[N]!=0)
{
printf("%d\n",result[N]);
}
else
{
for(i = 1;i<=N;i++)//初始化皇后
{
RQueen[i].X = 0;
RQueen[i].Y = i;
}
light1 = 1;//当 light1<1时候结束循环 ,light1表示第Y行的皇后进行运算
while(light1>0)
{
RQueen[light1].X = RQueen[light1].X + 1 ; //皇后往X轴走1个单位
if(RQueen[light1].X<=N)//判断皇后位置是否超出棋盘
{
Judge1 = Judge(RQueen,light1,N);//判断皇后位置是否重复
if(Judge1 == -1)//-1表示重复
{
if(RQueen[light1].X<N)// 位置未到最大值
{
continue;//继续往右走
}
else//到最大值
{
RQueen[light1].X = 0;//此行的皇后位置归0,返回上一行
light1--;
}
}
else//不重复
{
if(light1 ==N)//判断是否是最后一行
{
sum++;//是,SUM加一
}
else//否,跳到下一行
{
light1++;
}
}
}
else//超出棋盘
{
RQueen[light1].X = 0;//此行的皇后位置归0,返回上一行
light1--;
}
}
result[N] = sum;
sum = 0;
printf("%d\n",result[N]);
scanf("%d",&N);
}
}
}