求助、八皇后问题,运行不出结果
求助、八皇后问题,运行不出结果
#include <stdio.h>
#include <stdlib.h>
typedef int bool;
#define true 1
#define false 0
int num=0;
char m={'*'};
bool Check(int row,int column){
int i,j;
if(row==1)return true;
for(i=0;i<=row-2;i++){
if(m=='Q')return false;
}
i=row-2;
j=i-(row-column);
while(i>=0&&j>=0)
{
if(m=='Q')return false;
i--;
j--;
}
i=row-2;
j=row+column-i+2;
while(i>=0&&j<=7){
if(m='Q')return false;
i--;
j++;
}
return true;
}
void Output(void){
int i,j;
num++;
printf("可行解%d:\n",num);
for(i=0;i<8;i++){
for(j=0;j<8;j++){
printf("%c",m);
}
printf("\n");
}
}
void EightQueen(int row){
int j;
for(j=0;j<8;j++){
m='Q';
if(Check(row,j+1)==true){
if(row==8)Output();
else EightQueen(row+1);
}
m='*';
}
}
void main(void){
EightQueen(1);
}
本帖最后由 jhq999 于 2021-10-23 18:47 编辑
if(m='Q')return false;
i--;
j++;
if(m=='Q')return false;//是==不是=
建议以后先写值后写变量:
if('Q'==m)return false;//是==不是= #include <stdio.h>
#define QUEENS 8
#define IS_OUTPUT 1
int A, B, C, k;
int inc, * a = A, * b = B + QUEENS, * c = C;
void lay(int i) {
int j = 0, t, u;
while (++j <= QUEENS)
if (a + b + c == 0) {
k = a = b = c = 1;
if (i < QUEENS) lay(i + 1);
else {
++inc;
if (IS_OUTPUT) {
for (printf("(%d)\n", inc), u = QUEENS + 1; --u; printf("\n"))
for (t = QUEENS + 1; --t; ) k ? printf("Q ") : printf("+ ");
printf("\n\n\n");
}
}
a = b = c = k = 0;
}
}
int main(void) {
lay(1);
printf("%d皇后共计%d个解\n", QUEENS, inc);
return 0;
} 傻眼貓咪 发表于 2021-10-23 18:59
不写注释都是耍流氓{:5_104:} jhq999 发表于 2021-10-23 19:14
不写注释都是耍流氓
是全部都不懂呢?还是某些代码不懂?都是些基础代码,没有用到任何深入复杂代码啊?如果是全部都不懂,温馨建议从零学起,如果只是思路不明白,可以共同学习。{:10_249:} 傻眼貓咪 发表于 2021-10-23 19:52
是全部都不懂呢?还是某些代码不懂?都是些基础代码,没有用到任何深入复杂代码啊?如果是全部都不懂,温 ...
开个玩笑 jhq999 发表于 2021-10-23 20:08
开个玩笑
#include <stdio.h>
#define QUEENS 8
int A, B, C, k; // 定义棋盘大小,用于存储皇后位置
int inc, * a = A, * b = B + QUEENS, * c = C; // 定义棋盘边界大小(b 比原棋盘大,主要是为了方便出界计算)
void lay(int i)
{
int j = 0, t, u;
while (++j <= QUEENS) // j 为预设所有皇后位置
if (a + b + c == 0){
k = a = b = c = 1; // 真正皇后位置,1 表示该位置存在皇后,0表示该位置不存在皇后
if (i < QUEENS) lay(i + 1); // 递归函数,参数 i+1,计算出新可能
else
{
++inc; // 多少个解法
/*----------------- 开始打印结果 -----------------*/
for (printf("(%d)\n", inc), u = QUEENS + 1; --u; printf("\n"))
for (t = QUEENS + 1; --t; )
k ? printf("Q ") : printf("+ "); // 棋盘位置,Q 表示该位置存在皇后,+ 表示该位置为空
printf("\n\n\n");
}
a = b = c = k = 0; // 如果位置不符合皇后,则赋值 0,继续循环下一个位置
}
}
int main(void) {
lay(1); // 从位置 1 开始预设所有皇后位置
printf("%d皇后共计%d个解\n", QUEENS, inc);
return 0;
} 本帖最后由 桃花飞舞 于 2021-10-24 11:02 编辑
抱歉没看你的代码,我来讲下思路吧下来的图
图上面只考虑当前皇后一下面一半的因为有一半还没有放皇后,也就是说只考虑左下、正下、右下三个方向。
说白了就是一个递归的思想。xxx那行的弯曲箭头是考虑当前行不能放皇后,就回到上一行的情况。
下面是代码
------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#define N 8
typedef struct _tag_Pos
{
int ios;
int jos;
}Pos;
static char board;
static Pos pos[]={{-1,-1},{-1,0},{-1,1}};
static int count=0;
void init() //初始化棋盘
{
int i = 0;
int j = 0;
for( i=0; i<N+2; i++)
{
board = '#';
board = '#';
board = '#';
board = '#';
}
for ( i=1; i<=N; i++)
{
for (j=1; j<=N; j++)
{
board = ' ';
}
}
}
int check(int i, int j) //核对有没有和别的皇后冲突
{
int ret =1;
int p = 0;
for (p=0;p<3;p++)
{
int ni = i;
int nj = j;
while( ret && (board) != '#')
{
ni = ni + pos.ios;
nj = nj + pos.jos;
ret = ret && (board != '*');
}
}
return ret;
}
void display() //显示出棋盘和皇后的结果
{
int i = 0;
int j = 1;
for(i=0; i<N+2; i++)
{
for (j=0;j<N+2;j++)
{
printf("%c", board);
}
printf("\n");
}
}
void find(int i)//如果i>N就是到了棋盘边界,就display()显示出结果,否则就继续查找新的结果
{
int j = 0;
if ( i> N )
{
count++;
printf("Solution: %d\n", count);
display();
getchar();
}
else
{
for(j=1; j<=N; j++)
{
if( check(i, j) )
{
board = '*';
find(i+1);
board = ' ';
}
}
}
}
int main()
{
init();
find(1);
return 0;
}
页:
[1]