本篇文章给大家谈谈八皇后问题c语言最简洁,以及八皇后问题c语言枚举法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、八皇后问题求解的C语言程序的实现2、C语言实现关于八皇后的问题!急…..3、用C语言编写八皇后问题4、C语言八皇后问题5、如何用C语言编写八皇后问题?6、c语言编写八皇后问题
八皇后问题求解的C语言程序的实现
这是个前不久,我为别人写的一个代码;
八皇后问题共有92种解;
以下代码是解决:对于固定一个皇后位置,输出所有可能情况.
如果这不适合你的答案你可以,稍微改改的哦~~
代码如下:
#include “stdio.h”
bool board[8][8]={0};
int num=0; //满足条件的个数
int inix,iniy; //输入一个皇后的初始位置
void output() //输出
{
int i, j;
for(i=0;i8;i++)
{
for(j=0;j8;j++)
{
if(!board[i][j]) printf(“■ “);
else printf(“◆ “);
}
printf(“\n”);
}
num++;
printf(“\n\n”);
return ;
}
bool check(int x,int y) //判断是否能放
{
int i, j ;
for(i=0; i8 ; i++)
{
if(board[i][y]==1) return false;
}
for(i=0;i8;i++)
{
if(board[x][i]==1) return false;
}
i=x; j=y;
while(i0 j0 ) { i–; j–; }
for(;i8 j8 ; i++,j++)
if(board[i][j]==1) return false;
i=x; j=y;
while(i0 j7 ) {i–;j++;}
for(;i8 j=0 ; i++ ,j–)
if(board[i][j]==1) return false ;
return true ;
}
void search(int x,int num) // 搜索函数
{
int i;
if(num=8) { output(); return ;}
if(x==inix-1) search(inix,num+1);
else
{
for(i=0;i8;i++)
{
if(check(x,i))
{
board[x][i]=1;
search(x+1,num+1);
board[x][i]=0;
}
}
}
return ;
}
int main()
{
scanf(“%d %d”,inix,iniy);
board[inix-1][iniy-1] = 1 ;
search(0,0);
printf(“%d\n”,num);
return 0;
}
例如:
输入 : 1 1
输出 :
◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ◆ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ◆ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ◆ ■ ■ ■ ■
◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ■ ◆ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ■ ■ ◆ ■ ■ ■ ■
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ◆ ■ ■ ■
◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ■ ■ ◆ ■ ■ ■ ■
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ◆ ■ ■ ■
■ ■ ◆ ■ ■ ■ ■ ■
◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ■ ■ ■ ◆ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ◆ ■ ■ ■ ■
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ◆ ■ ■ ■ ■ ■
4
C语言实现关于八皇后的问题!急…..
【【一共有92个解 通过测试的了 如果你要写好的C程序 告诉我你的邮箱 我给你发过去 你直接用就是了】】
#include “stdio.h”
#include “stdlib.h”
#define QUEEN 8
int count = 0; //用于计算解集数量
/*
a[i] = j
表示在棋盘上第i行第j列放有一个棋子
*/
/* 输出N皇后问题的解
输入:
a[]
保存棋子信息的数组.
length
数组的长度 八皇后即为8
*/
void output (int a[],int length){
int i ,j;
count ++;
printf(“The %d of the solution is :\n”,count);
for(i =0;ilength;i++){
for(j= 0;jlength;j++)
printf(“%d”,a[i]==j?1:0);
printf(“\n”);
}
}
void check(int a[],int length,int off){
int i = 0;
int value;
/*如果off和长度相等,说明棋子已经放好了,输出*/
if(off == length){
output(a,length);
return;
}
/* 从0 到length-1表示依次在棋盘的第off行,第value列上放置棋子*/
for(value = 0;valuelength;value++){
/*校验*/
for(i = 0;ioff;i++)
if(value – a[i] == 0 //value-a[i]=0表示同一列上有两个棋子
||value – a[i]== off – i //value-a[i]= off -i表明同一左斜线上有两个棋子
||value – a[i]== i-off) //value-a[i]= i – off表明同一右斜线上有两个棋子
break;
if(i == off){ //校验完毕
a[off] = value; //将棋子放入
check(a,length,off+1); //继续放下一列
}
}
}
int main(){
int a[QUEEN] ;
check(a,QUEEN,0);
system(“pause”);
return 0;
}
用C语言编写八皇后问题
如下是8皇后的程序:
#includestdio.h
#includestdlib.h
void eightqueen(int a[][99],int n);
void print(int a[][99]);
int up(int a[][99],int row,int col);
int down(int a[][99],int row,int col);
int left(int a[][99],int row,int col);
int right(int a[][99],int row,int col);
int num=0;
main()
{
int a[99][99]={0},n; //将皇后的位置放在一个二维的数组里面,a[i][j]=1表示该位置有一个皇后
eightqueen(a,0);
system(“pause”);
return 0;
}
void print(int a[][99]) //输出当前的一种合理的走法。
{
int i,row,col;
printf(“Case %d\n”,num);
for(row=0;row8;row++)
{
for(col=0;col8;col++)
{
printf(“%d “,a[row][col]);
}
printf(“\n”);
}
printf(“\n”);
}
void eightqueen(int a[][99],int row) //通过回溯法计算8皇后的走法。
{
int col,i;
for(col=0;col=7;col++)
{
//判断都前位置是否是合理的位置。
if ((up(a,row,col)==0)(down(a,row,col)==0)(left(a,row,col)==0)(right(a,row,col)==0))
{
a[row][col]=1; //如果是,将当前位置置为1(摆放一个皇后)
if(row==7) //所有的8个皇后都已经摆放好了,输出当前的情况。
{
num++;
print(a);
}
else
{
eightqueen(a,row+1); //在row+1摆放下一个皇后。
}
a[row][col]=0;
}
}
}
//判断同一行列是否有其他的皇后
int up(int a[][99],int row,int col)
{
int i;
for(i=0;i8;i++)
{
if(a[i][col]==1)
{
return 1;
}
}
return 0;
}
//判断同一行上是否有其他的皇后
int down(int a[][99],int row,int col)
{
int i;
for(i=0;i8;i++)
{
if(a[row][i]==1)
{
return 1;
}
}
return 0;
}
//判断左上到右下的对接线上是否有其他的皇后
int left(int a[][99],int row,int col)
{
int i;
for(i=0;i8;i++)
{
if(((row+i)8)((col+i)8))
{
if(a[row+i][col+i]==1)
{
return 1;
}
}
if(((row-i)=0)((col-i)=0))
{
if(a[row-i][col-i]==1)
{
return 1;
}
}
}
return 0;
}
//判断左下到右上的对接线上是否有其他的皇后
int right(int a[][99],int row,int col)
{
int i;
for(i=0;i8;i++)
{
if(((row+i)8)((col-i)=0)) //
{
if(a[row+i][col-i]==1)
{
return 1;
}
}
if(((row-i)=0)((col+i)8)) //这儿的判断有问题,
{
if(a[row-i][col+i]==1)
{
return 1;
}
}
}
return 0;
}
C语言八皇后问题
解题分析:这个问题是由高斯首先提出的。
解决这一问题的最直接方法是穷举出所有摆法。我们先用回溯的思想按行递推出一种合理方案。开始棋盘为空,第一个皇后可以放在第一行的任意一个位置。我们把它试置在(1,1)。这样,满足J=1或I=J的格子都不能再放皇后了。第二个皇后置在第二行,J可取3..8中的任意一列,我们先试放在(2,3)。那么第三行的J可以取4..8,先试(3,4)。以此类推,第四个皇后在(4,2)((4,7),(4,8)也可);然后是(5,6)((5,8)也可);第六行就只有(6,8)这一个位置可选。这时,第七行已没有空位置可放,说明前面皇后的位置试选得不对。回溯到上一行,由于第六行已没有其他位置可选择,只能删除(6,8)这个皇后,再退到第五行,把(5,6)的皇后移到(5,8)。这样,第六行又没有可选位置了,回溯到第四行,把(4,2)移到(4,7)……最后,得出第一种可行方案:(1,1),(2,5),(3,8),(4,6),(5,3),(6,7),(7,2),(8,4)。
我们可以编写一个程序,让计算机按上述思路穷举出所有摆法(网上也很多,搜“八皇后”)。经计算机穷举,共有92种摆法。其实,这其中只有12种基本摆法,每种基本摆法又可经对称(水平、竖直、及沿两对角线翻转)、旋转(90、180、270度)等几何变换得出另外7种。这8种摆法的实质是一样的。那么,摆法共应有12*8=96种,为什么是92种呢?原来,在这12种基本摆法中,有一种是中心对称图形!用国际象棋记录法是:a4,b6,c8,d2,e7,f1,g3,h5.
推而广之还有所谓“N皇后问题”,即 在N*N的棋盘上,放置N个皇后。4皇后有2个答案,5后有10答,6后有4答,7后有40答,9后有352答,10后有724答。 超级简单,自己写的N皇后:(如果你硬要八就将N改为8就行了)源程序如下:
#includestdio.h
int q[20];
int count=0;
void print(int n)
{int i;brcount++;brfor(i=1;i=n;i++)br {printf(“(%d,%d)”,i,q[i]);br }
printf(“\n”);
}
int Place(int i,int k)
{int j;brj=1;brwhile(jk)br {if((q[j]==i) || abs(q[j]-i)==abs(j-k)) return 0;br j++;br }
return 1;
}
void Queens(int k,int n)
{int i;brif(kn)br print(n);brelsebr {for(i=1;i=n;i++)br if(Place(i,k)==1) br {q[k]=i;br Queens(k+1,n);br }
}
}
int main()
{int n;brscanf(“%d”,n);brQueens(1,n);brgetch();brreturn 0;br}
如何用C语言编写八皇后问题?
#include “stdio.h” \x0d\x0a#include “windows.h” \x0d\x0a#define N 8 /* 定义棋盘大小 */ \x0d\x0aint place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */ \x0d\x0avoid backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */ \x0d\x0avoid chessboard(); /* 每找到一个解,打印当前棋盘状态 */ \x0d\x0astatic int sum, /* 当前已找到解的个数 */ \x0d\x0ax[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */ \x0d\x0aint main(void) \x0d\x0a{ \x0d\x0abacktrack(0); \x0d\x0asystem(“pause”); \x0d\x0areturn 0; \x0d\x0a} \x0d\x0aint place(int k) \x0d\x0a{ \x0d\x0a/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */ \x0d\x0a/* x[k] 时,两皇后在同一列上;abs(k – j) == abs(x[j] – x[k]) 时,两皇 */ \x0d\x0a/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/ \x0d\x0afor (int j = 0; j
回答于 2022-12-11
c语言编写八皇后问题
#include stdlib.h
#includemath.h
#includeconio.h
#includestdio.h
int N=0;
int a[10][10];
int yp=1;
FILE * fp;
void main()
{
int *pa;
int m,n,f,aa;
int check(),reback();
int prt();
clrscr();
fp=fopen(“data.dat”,”w”);
printf(“please input the number of queens(4–10):”);
scanf(“%d”,N);
for(m=0;mN;m++)
for(n=0;nN;n++)
a[m][n]=0;
m=0;n=0;aa=0;
do{for(n=0;nN;n++)
{
f=check(m,n);
if(m==N-1 f==1){a[m][n]=1; prt();f=0;a[m][n]=0;}
if(f==1){ a[m][n]=1; break;}
if(n==N-1f==0)
{
do{
m–;
n=reback(m);
if(m==0 n==N-1 aa==1) break;
}while(n=N-1);
}
}
aa=1;
m++;
if(m=N)m=0;
}while(mN nN);
printf(“\n\n********IT’S OVER!!********”);
fprintf(fp,”\n\n**********IT’S OVER!!*******”);
close(fp);
getch();
}
int check(int x1,int y1)
{int a1,b1;
for(a1=0;a1x1;a1++){
for(b1=0;b1N;b1++){
if(a[a1][b1]==1){
if(a1==x1||b1==y1) return(0);
if((a1-b1)==(x1-y1)) return(0);
if((a1+b1)==(x1+y1))return(0);
}
}
}
return(1);
}
int reback(int w)
{
int x;
for(x=0;xN;x++)
if(a[w][x]==1)
{
a[w][x]=0;
return(x);
}
}
int prt()
{int t,y;
clrscr();
printf(“\n************ %d **************\n\n”,yp);
fprintf(fp,”\n************ %d **************\n\n”,yp);
yp++;
for(t=0;tN;t++){
for(y=0;yN;y++){
printf(“%3d”,a[t][y]);
fprintf(fp,”%3d”,a[t][y]);
}
printf(“\n”);
fprintf(fp,”\n”);
}
getch();
return(0);
}
关于八皇后问题c语言最简洁和八皇后问题c语言枚举法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。