皇后问题http://acm.hdu.edu.cn/showproblem.php?pid=2553

[复制链接]
查看11 | 回复1 | 2011-8-24 18:45:31 | 显示全部楼层 |阅读模式
#include #include int sum;int x[11];int Place(int k) {
for(int j=1; jn)
sum++;
else
for(int i=1; i<=n; i++) {
x[t]=i;
if(Place(t))
DFS(t+1,n);
}}int main() {
int re[11];
for(int i=1; i<=10; i++) {
sum=0;
DFS(1,i);
re=sum;
}
int n;
while(scanf("%d",&n),n) {
printf("%d\n",re[n]);
}
return 0;}这是上课时候老师给的代码,但我有很多不明白,a.在没判断条件前第二个皇后放在那里了b.所有格子遍历后,才发现第一个皇后不能放在开始的位置,又是怎么处理的,是怎么实现这个处理的。c.每次回溯到的位置在哪里,是怎么实现的,问题有点多,希望别太介意,要是有图解就更好了,要是介意分的,请说下,虽然所剩下的分不多,但也不会吝惜的

回复

使用道具 举报

千问 | 2011-8-24 18:45:31 | 显示全部楼层
貌似你连样例都还不能通过哈,觉得你应该至少把样例通过了再说,如果给你说明了你还做题干嘛。 oozoojoooo这个样例貌似有问题,我这样觉得只这样,对有问题。1,2,3规则都不符合~~ 不晓得是不是我理解有误哈, 不过据说应该这样做:1)确定有且只有一个z和j。2)确定z在j前面。3)判断zoj和zj的情况。4)判断xzojx的情况..即前后的o的个数相等,其实判断zoj是判断这个类型的逻辑子集。5)判断azbjc,看a,b,c是否相等...zj的判断是判断此类的子集。6)最后据说这判断azbjc 是否有a*b=c这个条件,至于为什么,不知道。... 综合发现第三步可以省略掉,貌似就这几个步骤哈~~...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行