当前位置:首页 » 编程语言 » c语言四皇后

c语言四皇后

发布时间: 2022-02-16 17:22:17

‘壹’ c语言 n皇后 求高手

八皇后问题各种语言版本:
http://ke..com/view/698719.htm
#include<iostream.h>

const int n = 15 ; //15皇后问题.改动n可变成N皇后问题
const int n_sub = n - 1 ;
int queen[n] ; //N个棋子.N对应每一列,如n=0的棋子只下在0列,1下1....类推
bool row[n] ; //棋局的每一行是否有棋,有则为1,无为0 ;
bool passive[2*n-1] ; //斜率为1的斜线方向上是不是有皇后
bool negative[2*n-1] ; //斜率为负1的斜线方向上是不是有皇后.
//之所以用全局变量,因全局数组元素值自动为0

int main()
{
int cur = 0 ;//游标,当前移动的棋子(哪一列的棋子)
bool flag = false ; //当前棋子位置是否合法
queen[0] = -1 ; //第0列棋子准备,因一开始移动的就是第0列棋子
int count = 0 ; //一共有多少种下法 ;
cout<<"============================Starting============================="<<endl ;

while(cur>=0)
{
while(cur>=0 && queen[cur]<n && !flag) //当还不确定当前位置是否可下
{
queen[cur]++ ;
// cout<<"第"<<cur<<"列棋子开始走在第"<<queen[cur]<<"行"<<endl ;
// cin.get() ;
if(queen[cur] >= n) { //如果当前列已经下完(找不到合法位置)
// cout<<"当前行是非法行,当前列棋子走完,没有合法位置,回溯上一列棋子"<<endl ;
// cin.get() ;
queen[cur] = -1 ; //当前列棋子置于准备状态
cur-- ; //回溯到上一列的棋子
if(cur>=0) {
row[queen[cur]] = false ;
passive[queen[cur] + cur] = false ;
negative[n_sub + cur - queen[cur]] = false ;
}
//由于要移下一步,所以回溯棋子原位置所在行应该没有棋子啦.置row[]为false
//并且棋子对应的斜线的标志位passive[cur]和negative[cur]也应该要设为false ;
}
else {
//先判断棋子所在行没有棋子
if(row[queen[cur]] == false) { //当前行没有棋子
// cout<<"棋子"<<cur<<"所在行没有其他棋子,正在检查斜线"<<endl ;
flag = true ; // 暂设为true,或与之前棋子斜交,则再设为false ;
//以下检查当前棋子是否与之前的棋子斜线相交
if( passive[queen[cur] + cur] == true || negative[n_sub + cur - queen[cur]] == true) {
flag = false ;
// cout<<"出现斜线相交,该位置不合法"<<endl ;
}
else
flag = true ;
if(flag) { //没有斜交,位置合法
// cout<<"斜线也没有相交,该位置合法"<<endl ;
if(cur == n-1) //如果是最后一个棋子
{
// cout<<"棋子走完一轮,总走法加1"<<endl ;
count++ ; //总走法加一 ;
}
row[queen[cur]] = true ;// 当前行设为有棋子
passive[queen[cur] + cur] = true ;//当前行正斜率方向有棋子
negative[n_sub + cur - queen[cur]] = true ; //当前行负斜率方向上也有棋子
cur++ ;
if(cur >= n) {
cur-- ;
row[queen[cur]] = false ;
passive[queen[cur] + cur] = false ;
negative[n_sub + cur - queen[cur]] = false ;//原理同回溯
}
flag = false ;
}
}
}//else
}
}
cout<<n<<"皇后问题一共有"<<count<<"种解法"<<endl ;
return 0 ;
}
你自己修改一下吧。

‘贰’ 帮忙用C语言编写程序“四皇后问题”

额。。搜一个八皇后的问题,把数组范围变成4*4,把判断条件改一下就可以了

‘叁’ 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;

‘肆’ C语言编程,用回溯法解四皇后问题

http://wenku..com/view/0ab2ec8984868762caaed5c8.html

‘伍’ C语言四皇后问题

那一步的意思是将之前的位置清零。
Q[i][j] = 1; // 先在 i、j 的位置上放皇后
Queen(j+1,Q); // 递归调用判断下一行的位置是否符合要求
Q[i][j] =0; // 位置i、j判断完了之后要清零,以便下一次判断。

就好像是这样的,比如第一行第三列你放了一个皇后:0 0 1 0
然后跟着判断下一行怎么放,再下一行怎么放 。。。一直递归下去。
把所有的情况都递归遍历完成后,再回到第一行,再在第四列放皇后,0 0 0 1。
然后再重复之前的判断,但是你在程序中,之前的第三列已经放了皇后的,所以在第四列放皇后之前,第三列的那个皇后要清掉。

‘陆’ 用C语言编写八皇后问题

#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");
}

‘柒’ 请教,做二个C语言程序,一个是日历程序,一个是经典八皇后问题的变形--四皇后程序。

来我空间给你八皇后程序

‘捌’ C语言,八皇后最简单的写法

/*八皇后问题是在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即
任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

1.我们需要一个数据存放已经放置皇后的位置,用指针表示的一维数据*position,长度为N(N为放置的皇后总数),
因为该问题是每行,每列,每组对角线只可能出现一个皇后,
所以用一维数据position+i中的i则能代码第几行,而值*(position+i)则表示该行中的列值.

2.判断每行可放置皇后,假设要判断第n行,则从position中从0到n-1每一个已放皇后的位置判断(列,对角线)*/

#include <iostream>
#include <math.h>
#include <malloc.h>
#include <windows.h>

using namespace std;

int *position; //放置的位置
int queen; //皇后数目
int count; //第N种可能性

//判断第n行是否放置皇后
bool SignPoint(int n)
{
for (int i=0;i<n;i++)
{
if (*(position+i) == *(position+n)) //该列已经放置过皇后了
return false;
if (abs(*(position+i) - *(position+n)) == n-i) //对角线已经放置过了
return false;
}
return true;
}

//设置皇后
void SetQueen(int n=0)
{
if (queen==n)
{

printf("NO.%d: ",++count);
printf("\n");
for (int i=0;i<queen;i++)
{
for (int j=0;j<queen;j++)
{
if (j == position[i])
{
printf("* ");Sleep(1500);
}
else
{
printf("0 ");
}
}
printf("\n");
}
printf("\n");
return;

}
else
{
for (int i=0;i<queen;i++)
{
position[n] = i;

if(SignPoint(n))//如果该位置放置皇后正确的话,则到下一行
{
SetQueen(n+1);
}
}
}
}

int main(int argc,char argv[])
{
cout<<"请输入皇后的总数:"<<endl;
cin>>queen;
position = (int*)malloc(sizeof(int));
SetQueen();
cout<<"摆放完毕"<<endl;
cin.get();
cin.get();
return 0;
}

‘玖’ 皇后问题用C语言表示

#include<stdio.h>
#include<math.h>
#define N 12
int ans[N],sum;
int check(int x)//验证可否放置
{
int i;
for(i = 0;i < x;i ++)
if( fabs(x-i) == fabs(ans[x]-ans[i]) || ans[x]==ans[i])
return 0;
return 1;
}
void DFS(int t)
{
int i,j;
if(t == N)
{
printf("第%d组解 \n",++sum);
for(i = 0;i < N ; i ++)
{
for(j = 0;j < N ; j ++)
{
if(j == ans[i]) printf("0 ");
else printf("1 ");
}
printf("\n");
}
printf("\n");
}
for(i = 0;i < N ;i ++)//搜索范围
{
ans[t] = i;
if(check(t)) DFS(t+1);
}
return ;
}
int main()
{
sum = 0;
DFS(0);
return 0;
}

热点内容
安卓日历每月提醒怎么设置 发布:2025-01-09 23:07:53 浏览:387
安卓手机qq怎么备份 发布:2025-01-09 23:07:12 浏览:956
kettle源码下载 发布:2025-01-09 23:01:36 浏览:733
casejava 发布:2025-01-09 22:56:56 浏览:698
oracle如何导出数据库 发布:2025-01-09 22:55:13 浏览:771
编程ppm 发布:2025-01-09 22:49:25 浏览:729
蒸汽之都侦探安卓按键在哪里 发布:2025-01-09 22:48:30 浏览:819
怎么修改域账号的配置文件 发布:2025-01-09 22:30:44 浏览:478
49葫芦娃怎么改密码 发布:2025-01-09 22:30:00 浏览:844
博德之门安卓安装哪里 发布:2025-01-09 22:14:40 浏览:316