长大1/2 发表于 2020-2-11 21:22:39

八皇后问题

参考了小甲鱼的代码,虽然有些地方看不懂
这里的left函数不是必须的,只是为了严谨
{:5_95:} 花了几天时间,想出来了感觉好有成就感


#include <stdio.h>
#define OCUR 'O'         //该位置已有皇后
#define NOTOCUR '*'   //无皇后时数组的填充符号
#define NUM 8         //皇后个数

void Queen(int x,int y,char str);// 求解函数
void print(char str);//打印解函数
int left(int x,int y,char str);//判断(x,y)的左侧是否已有皇后
int top(int x,int y,char str);//判断(x,y)的上侧是否已有皇后
int left_top(int x,int y,char str);//判断(x,y)的左上侧是否已有皇后
int right_top(int x,int y,char str);//判断(x,y)的右上侧是否已有皇后
void init(char str);//初始化,使棋盘上无皇后
static int count = 0;//全局变量,用于记录已求解的个数

int main(){
        char str;

        int x=0,y=0;
        while(x != NUM){
                printf("当x=%d时---->\n",x);
                init(str);
                Queen(x,y,str);
                x++;
        }
        printf("count = %d\n",count);

        return 0;
}
void init(char str){
        int i,j;
        for(i=0;i<NUM;i++){
                for(j=0;j<NUM;j++){
                        str = NOTOCUR;
                }
        }
}
void print(char str){
        printf("找到第%d组:\n",count);
        int i,j;
        for(i=0;i<NUM;i++){
                for(j=0;j<NUM;j++){
                        printf("%c ",str);
                }
                putchar('\n');
        }
        printf("*******************\n");
}
void Queen(int x,int y,char str){
        if(top(x,y,str) && left(x,y,str) && left_top(x,y,str) && right_top(x,y,str)){
                str = OCUR;
                y++;
                x=0;
                if(y == NUM){
                        count++;
                        print(str);
                        return;
                }
                while(x != NUM){
                        Queen(x,y,str);
                        str = NOTOCUR;
                        x++;
                }
        }
       
        return;
}
int top(int x,int y,char str){
        int j;
       
        for(j = y;j >= 0;j--){
                if(str == OCUR){
                        return 0;
                }
        }
       
        return 1;
}
int left(int x,int y,char str){
        int i;

        for(i = x;i >= 0;i--){
                if(str == OCUR){
                        return 0;
                }
        }
       
        return 1;
}
int left_top(int x,int y,char str){
        int i,j;

        for(i=x,j=y;i>=0 && j>=0;i--,j--){
                if(str == OCUR){
                        return 0;
                }       
        }

        return 1;
}
int right_top(int x,int y,char str){
        int i,j;

        for(i=x,j=y;i < NUM && j>=0;i++,j--){
                if(str == OCUR){
                        return 0;
                }       
        }
       
        return 1;
}
页: [1]
查看完整版本: 八皇后问题