| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1249 人关注过本帖
标题:八皇后递归 高手看下为什么 结果不对
只看楼主 加入收藏
shuihan
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-9-22
收藏
 问题点数:0 回复次数:5 
八皇后递归 高手看下为什么 结果不对
八皇后递归
问题描述:
在8×8的国际象棋棋盘上放置8个皇后,然后要求没有皇后能吃掉另一个皇后.即是任意两个皇后都不处于棋盘的同一行,同一列或同一对角线上.

我们规定:棋盘中的i表示行,j表示列.[i,j]表示i行j列..[i,j]是否安全,则要对上睡觉上对角线和下对角线分别进行编号;由于上对角线和下对角线i+j是一个常量,所以用i-j和i+j分别作为上对角线和下对角线的编号.

设a[j]表i列无皇后,b[j]和c[j]分别表示i个上对角线和j个下对角线上无皇后.这样,方格[i,j]是否安全意味着
a[j]&&b[i-j+7]&&c[i+j]
是不是为turn;
而将皇后放置与方格[i,j]或者从方格[i,j]移去皇后就应使a[j], b[i-j], c[i+j]这三个不尔变量同时为false或同时为ture.
此外,设整型数组x[ ]表示八皇后所占方格位置.而x[i]的值表示第i行中皇后所占的列编号.如x[2]=6表示第2行中的皇后位于第6列.
#include<stdio.h>
#include<conio.h>
int a[8],b[15],c[15],x[8];
int sum=0;
main()
{

int k;
for(k=0;k<=7;k++)
a[k]=1;
for(k=0;k<=14;k++)
b[k]=c[k]=1;


clrscr();
try();

printf("sum=%d",sum);
}

void print()
{
int i;
for(i=0;i<=7;i++)
printf("(%d,%d)",i,x[i]);
printf("\n");
sum++;
}

try(int i)
{
int j;
for(j=0;j<=7;j++)
if( a[j]&&b[i-j+7]&&c[i+j])
{
x[i]=j;
a[j]=0;
b[i-j+7]=0;
c[i+j]=0;
if(i<7)
try(i+i);
else
print();
a[j]=1;
b[i-j+7]=1;
c[i+j]=1;
}
}

我把主函数的中的try()括号 中不填数字和填不同数字时 结果是不同 比如 0 或 1 等 但结果都是错误的
为什么??在线等!!!
搜索更多相关主题的帖子: 皇后递归 对角线 国际象棋 结果 
2007-12-31 12:19
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
没缩进的程序懒得看。
程序代码:
#include <stdio.h>
#include <stdlib.h>

int x[8];
int used[8];
int diag1[16];
int diag2[16];
int count;

int dfs(int d)
{
    if(d==8){
        for(int i=0;i<8;i++){
            printf("%d ",x[i]);
        }    
        printf("\n");
        count++;
    }    
    else {
        for(int i=0;i<8;i++){
            if(!used[i] && !diag1[d+i] && !diag2[8+d-i]){
                diag2[8+d-i]=1;
                diag1[d+i]=1;
                used[i]=1;
                x[d]=i;
                dfs(d+1);
                used[i]=0;
                diag1[d+i]=0;
                diag2[8+d-i]=0;
            }    
        }    
    }    
}    

int main()
{
    dfs(0);
    printf("count=%d\n",count);
//    system("pause");
}
2007-12-31 13:32
shuihan
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-9-22
收藏
得分:0 
缩下
不好意思.我把它缩一下
#include<stdio.h>
#include<conio.h>
int a[8],b[15],c[15],x[8];
int sum=0;
main()
{

int k;
for(k=0;k<=7;k++)
a[k]=1;
for(k=0;k<=14;k++)
b[k]=c[k]=1;


clrscr();
try();

printf("sum=%d",sum);
}

void print()
{
int i;
for(i=0;i<=7;i++)
printf("(%d,%d)",i,x[i]);
printf("\n");
sum++;
}

try(int i)
{
int j;
for(j=0;j<=7;j++)
if( a[j]&&b[i-j+7]&&c[i+j])
  {
    x[i]=j;
    a[j]=0;
    b[i-j+7]=0;
    c[i+j]=0;
    if(i<7)
    try(i+i);
    else
   print();
   a[j]=1;
   b[i-j+7]=1;
   c[i+j]=1;
  }
}

我把主函数的中的try()括号 中不填数字和填不同数字时 结果是不同 比如 0 或 1 等 但结果都是错误的
为什么??在线等!!!
2007-12-31 14:19
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
还是我帮我缩进吧,改好了,主要是你把try(i+1)写成了try(i+i),还有在main中调用的时候没加参数
程序代码:
#include<stdio.h> 
#include<conio.h> 

int a[8],b[15],c[15],x[8];
int sum=0;

void try_(int i);

int main()
{ 
    
    int k; 
    for(k=0;k<=7;k++) 
        a[k]=1; 
    for(k=0;k<=14;k++) 
        b[k]=c[k]=1; 
    
    
    //clrscr(); 
    //try_();
    try_(0);//try在C++里是关键字,我编译器是C++的,所以加了个下划线
    
    printf("sum=%d\n",sum); 
} 

void print() 
{ 
    int i; 
    for(i=0;i<=7;i++) 
        printf("(%d,%d)",i,x[i]); 
    printf("\n"); 
    sum++; 
} 

void try_(int i)
{ 
    int j; 
    for(j=0;j<=7;j++) 
        if( a[j]&&b[i-j+7]&&c[i+j]) 
        { 
            x[i]=j; 
            a[j]=0; 
            b[i-j+7]=0; 
            c[i+j]=0; 
            if(i<7)
                try_(i+1); 
                //try_(i+i); 
            else 
                print(); 
            a[j]=1; 
            b[i-j+7]=1; 
            c[i+j]=1; 
        } 
}
2007-12-31 15:55
shuihan
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-9-22
收藏
得分:0 
运行不了,我用的是tc
结果不对,呵呵
2007-12-31 17:06
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
你把注释的地方擦掉再编译吧
2007-12-31 23:04
快速回复:八皇后递归 高手看下为什么 结果不对
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012722 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved