当前位置:首页 » 编程语言 » c语言皇后排序
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言皇后排序

发布时间: 2022-07-27 20:01:06

A. c语言中8皇后问题--怎么解决上下两种方法是否重复

#include "stdio.h"
#include "windows.h"
#define N 8 /* 定义棋盘大小 */
int place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */
void backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */
void chessboard(); /* 每找到一个解,打印当前棋盘状态 */
static int sum, /* 当前已找到解的个数 */
x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */
int main(void)
{
backtrack(0);
system("pause");
return 0;
}
int place(int k)
{
/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */
/* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */
/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/
for (int j = 0; j < k; j ++)
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;
return 1;
}
void backtrack(int t)
{
/* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */
if (t == N) chessboard();
else
for (int i = 0; i < N; i ++) {
x[t] = i;
if (place(t)) backtrack(t + 1);
}
}
void chessboard()
{
printf("第%d种解法:\n", ++ sum);
for (int i = 0; i < N; i ++) {
for (int j = 0; j < N; j ++)
if (j == x[i]) printf("@ ");
else printf("* ");
printf("\n");
}
printf("\n");
}

B. 用C语言编写八皇后问题

如下是8皇后的程序:
#include<stdio.h>
#include<stdlib.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;row<8;row++)
{

for(col=0;col<8;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;i<8;i++)
{
if(a[i][col]==1)
{
return 1;
}
}
return 0;
}
//判断同一行上是否有其他的皇后
int down(int a[][99],int row,int col)
{
int i;
for(i=0;i<8;i++)
{
if(a[row][i]==1)
{
return 1;
}
}
return 0;
}

//判断左上到右下的对接线上是否有其他的皇后
int left(int a[][99],int row,int col)
{
int i;
for(i=0;i<8;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;i<8;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. c语言n皇后问题

if(i==n-1)执行到了,但是 i 取值有问题,j=0的时候i就增加到5,j>0之后if(i==n-1)就不可能成立了

D. 如何用C语言解决N皇后问题并作出流程图

#include"iostream"

using namespace std;

const max_board = 13;

class Queen
{
public :
Queen(int size);
bool is_solved() const; //判断是否已经填满
void print() const; //打印结果
bool unguarded(int col) const; //判断是否被锁定
void insert(int col); //在该位放置皇后
void remove(int col); //移除皇后
// void solve_from(Queen &configuration);
int board_size; //边界
private :
int count; //已放置皇后的数目
bool queen_square[max_board][max_board]; //棋盘
};
Queen::Queen(int size)
{
if(size<1)
board_size=1;
else
if(size>13)
board_size=13;
else
board_size=size;
count=0;
for(int i=0;i<board_size;i++)
for(int j=0;j<board_size;j++)
{
queen_square[i][j]=false;
}
}
bool Queen::is_solved() const
{
return count==board_size;
}
void Queen::print() const
{
for(int i=0;i<board_size;i++)
{
for(int j=0;j<board_size;j++)
{
cout<<queen_square[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
bool Queen::unguarded(int col) const
{
int i;
bool ok=true;
for(i=0;ok&&i<count;i++)
{
ok=!queen_square[i][col];
}
for(i=1;i<=col&&i<=count&&ok;i++)
{
ok=!queen_square[count-i][col-i];
}
for(i=1;i<board_size-col&&i<=count&&ok;i++)
{
ok=!queen_square[count-i][col+i];
}

return ok;
}
void Queen::insert(int col)
{
queen_square[count++][col]=true;
}
void Queen::remove(int col)
{
queen_square[--count][col]=false;
}
void solve_from(Queen &configuration)
{
if(configuration.is_solved())
configuration.print();
else
for(int col=0;col<configuration.board_size;col++)
if(configuration.unguarded(col))
{
configuration.insert(col);
solve_from(configuration);
configuration.remove(col);
}
}
int main()
{
int n;
cout<<"please input the size:\t";
cin>>n;
Queen queen(n);
solve_from(queen);
return 0;
}

E. C语言中关于4皇后或8皇后问题!

用栈,以及回溯法来做
#include<stdio.h>
#include<math.h>

int place(int b);
int a[10]; //定义栈来记录皇后位置

int main(void)
{
int n; //输入
int k; //第k个皇后
int j; //输出结果用
scanf("%d",&n);
a[1]=0;
k=1; //第一个皇后开始

while(k>0)
{
a[k]=a[k]+1; //第一次是从1开始,以后是退回前一个皇后时这个皇后的位置向后挪一位

while(a[k]<=n&&!place(k)) // 位置合法?
a[k]=a[k]+1; //不合法再向后挪一位
if(a[k]<=n) //位置没有超过合法位置
{
if(k==n) //全部皇后安放完
{
for(j=1;j<=n;j++)// 输出位置
printf("%3d",a[j]);
printf("\n");
}
else //还有皇后没有放
{
k++; //继续放下一个皇后
a[k]=0; //初始化位置
}
}
else //位置不合法
k--; //退回去,回溯
}

return 0;

F. 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就行了)源程序如下:
#include<stdio.h>
int q[20];
int count=0;
void print(int n)
{int i;<br>count++;<br>for(i=1;i<=n;i++)<br> {printf("(%d,%d)",i,q[i]);<br> }
printf("\n");
}
int Place(int i,int k)
{int j;<br>j=1;<br>while(j<k)<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;<br>if(k>n)<br> print(n);<br>else<br> {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;<br>scanf("%d",&n);<br>Queens(1,n);<br>getch();<br>return 0;<br>}

G. 用c语言解决八皇后问题,要求第一个皇后位置用键盘输入,需要详细代码和解释,谢谢、

#include "stdio.h"
#include "math.h"
int row[8];
void arrange(int k)
{
int i,j;
if(k>8){
for(i = 1;i<=8;i++)
printf("%2d\n",row[i]);//k>8时应该输出各列皇后的行号
return ;
}

for(j = 1;j <=8;j++) //试探第k列的每一个行号
{
for(i = 1;i <k ;i++)
if(row [i] == j || (k-i) == abs(row[i] - j))
break;
if(i>=k) //成立说明第k列的第j行可用,则放置一个皇后
{
row [k] = j;
arrange(k+1); //安排第k+1列至第八列皇后
}
}
}
void main()
{
arrange(1);
}
这是全部八皇后的可能性的代码,其中主要算法以及有了,相信你可以自己改出来的,否则直接给你的话就没有意义了。。。

声明,这段代码摘自西南交大《c程序设计教程》。。。