2 moon down wrp moon_down_wrp 于 2015.06.13 23:01 提问

八皇后 递归方法 遇到奇怪问题。。。 2C

record[0][0] 未被赋值的情况下,前后两次查看,值不一样,运行结果的前两行即是record[0][0],一次是1,一次是0

 #include<stdio.h>
#include<stdlib.h>
int control[8][8]={0};
int record[92][8]={0};
int count=0;
int floor=1;
int tmp[8];
int p;
void setControlArea(int rowid,int colid){
    int i,j;
    for(i=rowid+1;i<8;i++) control[i][colid]++; 
    for(i=rowid+1,j=colid+1;i<8,j<8;i++,j++) control[i][j]++;
    for(i=rowid+1,j=colid-1;i>=0,j>=0;i++,j--) control[i][j]++; //只管下面两条线 
} 
void releaseControlArea(int rowid,int colid){
    int i,j;
    for(i=rowid+1;i<8;i++) control[i][colid]--; 
    for(i=rowid+1,j=colid+1;i<8,j<8;i++,j++) control[i][j]--;
    for(i=rowid+1,j=colid-1;i>=0,j>=0;i++,j--) control[i][j]--; //只管下面两条线 
}
//递归解法
void find(){
    int j;
    if(floor==8){
        for(j=0;j<8;j++){
            if(control[7][j]==0) {
            tmp[7]=j+1;
            for(p=0;p<8;p++){
                record[count][p]=tmp[p];
                if(count==0&&p==0) printf("\nhahaha  %d\n",record[count][p]);
            }
            count++;
            break;}
        }
        floor--;
        return;
    }
    else if(floor==1){
        for(j=0;j<8;j++){
           tmp[0]=j+1;           
           setControlArea(0,j);
           floor++;
           find();
           releaseControlArea(0,j);
        }
        floor--;
        return;
    }
    else{
        for(j=0;j<8;j++){
           if(control[floor-1][j]==0){
             tmp[floor-1]=j+1;
             setControlArea(floor-1,j);
             floor++;
             find();
             releaseControlArea(floor-1,j);             
           }
        }
        floor--;                
    }   
}
int main(){
    int i,j;
    find();
    printf("\n%d\n",record[0][0]);
    for(i=0;i<count;i++){
        for(j=0;j<8;j++){
           printf("%d",record[i][j]);                   
        }
        printf("\n");
    }
    printf("%d",count);
    system("pause");
} 

图片说明

1个回答

lzp_lrp
lzp_lrp   Ds   Rxr 2015.06.14 22:03

record[0][0] 要赋初始值,否则可以会导致一些莫名其妙的问题,因为里的数据可能是随机的

moon_down_wrp
moon_down_wrp 谢谢,解决了,是因为control数组和record数组的空间紧挨着,我在对control数组操作时越界了,导致record中前5行内容被改变了。。。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片