ACM2553

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);
		}

	}			
}
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值