新手关于8皇后问题求教各位高手,谢谢了~

时间:2021-12-02 11:20:05
说明 :使用bc ++ 3.1 运行成功
问题 :结果是否正确?
              能在优化些么?
              程序还有哪里需要改进的?
              

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <dos.h>
#include <bios.h>

void checker(void);
void check(int (*)[],int,int);
int PutQueen(int (*)[],int,int);
int main(void)
{
int graphdriver,graphmode;
int array[8][8] = {0};
int count,i,j,k,m;

detectgraph(&graphdriver,&graphmode);
initgraph(&graphdriver,&graphmode,"c:\\borlandc\\bgi");

for(i = 0 ; i < 8 ; i ++) //皇后放置的第一个位置
for(j = 0 ,count =0;j < 8 ; j ++)
{
setbkcolor(BLACK);                                     //重画棋盘
cleardevice();
setcolor(WHITE);
checker();
if(PutQueen(array,j,i) == 1)
count ++;
if(bioskey(0) == 0x11b)
exit(1);

for(m = 0 ; m < 8 ; m ++) //清空棋盘准备测试下一个位置
for(k = 0 ; k < 8 ; k ++)
array[m][k] = 0;
}
closegraph();
printf("There are <%d> ways to put eight queen!\n",count);
return 0;
}
int PutQueen(int (*array)[8],int x,int y) //在制定位置放置皇后并测试全盘能否放置8个皇后
{
int count = 0,flag;
for(flag = 0; flag < 8 ;y ++,flag ++)
{
y %= 8;

for(x = flag != 0 ? 0 : x;x < 8; x ++)
{
if(array[y][x] != -1)
{
setcolor(BLUE);
circle(30 + x * 60,30 +y * 60,20);
circle(30 + x * 60,30 +y * 60,18);
check(array,x,y);
count ++;
break;
}
}
}

return (count == 8 ? 1 : 0);
}
void CountCoor(int,int,int,int,int,int,int (*)[]);
void check(int (*array)[8],int x,int y) //在皇后攻击范围内设置标识
{
CountCoor(x,y,1,0,8,-1,array); //x++;
CountCoor(x,y,-1,0,-1,-1,array);  //x--;
CountCoor(x,y,0,1,-1,8,array); //y++;
CountCoor(x,y,0,-1,-1,-1,array); //y--;
CountCoor(x,y,1,1,8,8,array); //x++,y++;
CountCoor(x,y,-1,-1,-1,-1,array); //x--,y--;
CountCoor(x,y,1,-1,8,-1,array); //x++,y--;
CountCoor(x,y,-1,1,-1,8,array); //x--,y++;
}
void CountCoor(int x,int y,int numx,int numy,int limitx,int limity,int (*array)[8]) //攻击范围显式标注
{
while((x+= numx) != limitx && (y+=numy) != limity)
{
if(*(*(array + y)+x) != -1)
{
*(*(array + y)+ x) = -1;
setcolor(RED);
line(x * 60,y * 60,x * 60 + 60,y * 60 + 60);
line(x * 60 + 60 , y * 60,x * 60,y*60 + 60);
}
}
}

void checker(void) //画棋盘
{
int i,j,k,coorx,coory;
for(i = 0 ; i < 8 ; i ++)
{
for(j = 0 ; j < 8 ; j ++)
{
if(i % 2 == 0 && j % 2 != 0)
continue;
else if(i % 2 != 0 && j % 2 == 0)
continue;
for(coorx = j * 60,coory = i * 60,k = 0; coorx + k < coorx + 60;k ++)
line(coorx + k,coory,coorx + k,coory + 60);
}
}
}

6 个解决方案

#1


我先试一下。

#2


缺少#include    <graphics.h>,运行不了。

#3


引用 2 楼  的回复:
缺少#include <graphics.h>,运行不了。

borlandc 设置
options -> linker -> libraires -> []graphics library(选中此项)

initgraph(&graphdriver,&graphmode,"c:\\borlandc\\bgi");此句中字符串部分改为你电脑中borlandc所在目录和盘符;


对了补充个问题,如何能将此程序做的兼容性更好些呢?有没有高手能告诉我?

#4


引用 3 楼  的回复:
引用 2 楼 的回复:
缺少#include <graphics.h>,运行不了。

borlandc 设置
options -> linker -> libraires -> []graphics library(选中此项)

initgraph(&amp;graphdriver,&amp;graphmode,"c:\\borlandc\\bgi");此句中字符串部分改为你电脑中bo……

graphics.h
这个现在好多平台都没有...

#6


攻击范围计算可以用递归 x++哪些;

#1


我先试一下。

#2


缺少#include    <graphics.h>,运行不了。

#3


引用 2 楼  的回复:
缺少#include <graphics.h>,运行不了。

borlandc 设置
options -> linker -> libraires -> []graphics library(选中此项)

initgraph(&graphdriver,&graphmode,"c:\\borlandc\\bgi");此句中字符串部分改为你电脑中borlandc所在目录和盘符;


对了补充个问题,如何能将此程序做的兼容性更好些呢?有没有高手能告诉我?

#4


引用 3 楼  的回复:
引用 2 楼 的回复:
缺少#include <graphics.h>,运行不了。

borlandc 设置
options -> linker -> libraires -> []graphics library(选中此项)

initgraph(&amp;graphdriver,&amp;graphmode,"c:\\borlandc\\bgi");此句中字符串部分改为你电脑中bo……

graphics.h
这个现在好多平台都没有...

#5


#6


攻击范围计算可以用递归 x++哪些;