1. c语言n皇后问题
if(i==n-1)执行到了,但是 i 取值有问题,j=0的时候i就增加到5,j>0之后if(i==n-1)就不可能成立了
2. N皇后问题c语言代码不知道哪里有问题,求高手啊!
//以下是我手头有的AC程序
#include<stdio.h>
#include<math.h>
int place(int k,int *X)//检查可宏歼不蔽兄冲可以放置一个新的皇后
{
int i=1;
while(i<k){
if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k)))return 0;
i++;
}
return 1;
}
void Nqueens(int n,int *X)
{
int k=1,i;X[1]=0;
while(k>0){
X[k]=X[k]+1;
while((X[k]<=n)&&(!place(k,X)))X[k]++;
if(X[k]<=n)if(k==n){
for(i=1;i<尘笑=n;i++)printf("%-6d",X[i]);
printf("\n");
}
else {k++;X[k]=0;}
else k=k-1;
}
}
int main()
{
int n;
int i;
printf("请输入皇后的个数:");
scanf("%d",&n);
int X[20];
Nqueens(n,X);
}
3. c语言 N皇后问题
q[j] == i表示与上个棋子同列(同行是不可能,不用考虑),还有情况得舍弃的就是斜线蔽埋,左斜和右斜,)(abs(q[j]-i)==(abs(j-k))))这个就表示与前面的棋子是否在同型唯一斜线,左斜右斜都包括了,你自己写写就能总结出这卜并培个式子了,数学计算而已。不懂HI我
4. 如何用C语言编写八皇后问题
#include "stdio.h" x0dx0a#include "windows.h" x0dx0a#define N 8 /* 定义棋盘大小 */ x0dx0aint place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */ x0dx0avoid backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */ x0dx0avoid chessboard(); /* 每找到一个解,打印当前棋盘状态 */ x0dx0astatic int sum, /* 当前已找到解的个数 */ x0dx0ax[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */虚衫 x0dx0aint main(void) x0dx0a{ x0dx0abacktrack(0); x0dx0asystem("pause"); x0dx0areturn 0; x0dx0a} x0dx0aint place(int k) x0dx0a{ x0dx0a/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */ x0dx0a/* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */差伏腔 x0dx0a/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/ x0dx0afor (int j = 0; j < k; j ++) x0dx0aif (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0; x0dx0areturn 1; x0dx0a} x0dx0avoid backtrack(int t) x0dx0a{ x0dx0a/* t == N 时,算法搜索至叶结厅悔点,得到一个新的N皇后互不攻击的放置方案 */ x0dx0aif (t == N) chessboard(); x0dx0aelse x0dx0afor (int i = 0; i < N; i ++) { x0dx0ax[t] = i; x0dx0aif (place(t)) backtrack(t + 1); x0dx0a} x0dx0a} x0dx0avoid chessboard() x0dx0a{ x0dx0aprintf("第%d种解法:\n", ++ sum); x0dx0afor (int i = 0; i < N; i ++) { x0dx0afor (int j = 0; j < N; j ++) x0dx0aif (j == x[i]) printf("@ "); x0dx0aelse printf("* "); x0dx0aprintf("\n"); x0dx0a} x0dx0aprintf("\n"); x0dx0a}
5. 如何用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;
}
6. 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 ;
}
你自己修改一下吧。
7. 怎么运用最佳优先搜索求解N皇后问题 用c语言实现 求代码
#include <iostream>
#include <cmath>
using namespace std;
int w=1;
const int n=8;
void fun(int a[],int n,int t) //滴t行的皇后位子
{
int p;
for (int i=1;i<=n;i++)
{
p=1;
a[t]=i; //皇后在 t 行 i 列
for (int j=1;j<t;j++)
{
if (a[t]==a[j]||(fabs(a[t]-a[j])==fabs(t-j))) //洞罩拍不满足皇后的要求
{
p=0;
break;
}
}
if(p==1) //满闷伍足皇后的要求
{
if (t==n)
{
cout<<纳羡"\n8皇后的第"<<w<<"解:";
for (int k=1;k<=n;k++)
{
cout<<"("<<k<<","<<a[k]<<")";
}
w++;
}
else
fun(a,n,t+1);
}
}
}
void main()
{
int t=1;
int a[n];
fun(a,n,t);
if (w==1)
cout<<"无解!\n";
}
8. N皇后回溯问题 解释下这程序 C语言
#include <stdio.h>
#define DelayTime 20000
#define TopX 10
#define TopY 5
int N;/*此处开始设置几个全局变量 N即代表皇后个数*/
int a[8], b[15], c[15];
int Num = 0;/*Num代表解决方法个数*/
int row;
/******************************************************************************/
void BackTrack (int row)
{
int col;
for (col=1; col<=N; col++)
{
if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0) /*1,为什么这里要等于0? if语句里的3个表达式都代表什么呢?*/
{
a[col-1] = 1;
b[row+col-2] = 1;
c[row-col+N-1] = 1;
gotoxy(col*2 + TopX, row + TopY); /* 2,这里的gotoxy()语句是做什么的? 仅仅是跳到相应位置,打印Q*/
putch('Q');
if (row < N)
{
BackTrack (row + 1); /* 3,这句什么意思? 递归调用*/
}
else
{
Num++;
gotoxy(40, 9); /* 4,这里又是做什么的?什么用?*/
printf("Num: %d ", Num);
delay(DelayTime); /* 5,这里又有什么用?延迟*/
}
a[col-1] = 0;
b[row+col-2] = 0; /* 6,这个三个表达式怎么又成0了?*/
c[row-col+N-1] = 0;
gotoxy(col*2 + TopX, row + TopY); /* 7,这又是什么用?*/
putch('.');
}
}
}
/********************************************************************************/
void main()
{
int i, j;
clrscr();
gotoxy(1, 10);
printf("Input the number of queen: ");
while(N <= 0 || N > 100)
{
scanf("%d", &N);
if(N > 100) printf("Two huge number, input again:");
if(N <= 0) printf("Can's smaller than 1, again:");
}
clrscr();
for(i=1; i<=N; i++)
{
for(j=1; j<=N; j++)
{
gotoxy(i*2 + TopX, j + TopY); /* 8,这里又是什么用? 将光标移动到指定位置说明:gotoxy(x,y)将光标移动到指定行y和列x。
*/
putch('.');
}
}
BackTrack(1); /* 9,为什么是1呢?不是应该传递的是皇后的数量吗?第一行,N为皇后的数量*/
gotoxy(12, 17); /* 10,这又是什么用?*/
printf ("There are %d kinds of solution.\n", Num);
getch();
}
9. N皇后问题(C语言,5<n<14)
N, n 是拉丁字母中的第14个字母。
闪族语中的Nûn可能是表示“蛇”的图形,它的音值是/n/,这与希腊语、伊特鲁里亚语、拉丁语和所有当代语言的发音是一样的。希腊名称是:Nυ,Ny。
字母N的含意
大写N代表
在化学中,表示元素氮的化学符号
牛顿,物理学力的单位
数学中,代表自然数集
小写n代表
在代数学中,常用作为整数值的变量
音标
国际音标
[n]是齿龈鼻音
[..]是小舌鼻音
汉语拼音
“n”是舌尖前鼻音 (齿龈鼻音)
字符编码
字符编码 ASCII Unicode EBCDIC
大写 N 78 004E 213
小写 n 110 006E 149
参看
修饰自N的字母
ǹ — Ńń — Ňň — Ņņ
其他字母中的相近字母
..(希腊字母 Nu)
..(西里尔字母 En)
词性
n表示名词
元素符号: N 英文名: Nitrogen 中文名: 氮
相对原子质量: 14.0067 常见化合价: -3,+1,+2,+3,+4,+5 电负性: 3.04
外围电子排布: 2s2 2p3 核外电子排布: 2,5
同位素及放射线: N-13[9.97m] *N-14 N-15 N-16[7.13s]
电子亲合和能: -20 KJ·mol-1
第一电离能: 1402.3 KJ·mol-1 第二电离能: 2856.1 KJ·mol-1 第三电离能: 4578.1 KJ·mol-1
单质密度: 0.0012506 g/cm3 单质熔点: -209.9 ℃ 单质沸点: -195.8 ℃
原子半径: 0.75 埃 离子半径: 1.71(-3) 埃 共价半径: 0.75 埃
常见化合物: NH3 各种铵盐 N2O NO NO2 N2O3 N2O4 N2O5 HNO3 Li3N Mg3N2 AlN AgNO3
发现人: D.卢瑟福 时间: 1772 地点: 苏穗芹格兰
名称由来:
希腊文:nitron和genes(由苏打形成)。
元素描述:
无色无臭无味的不活泼气体。在宇宙中含量第五,形成了地球大气层的78%。
元素来源:
通过分馏液态空气得到。
元素用途:
主要用码缺于制造氨气和其他化肥,也用来制造能应用于炸药的硝酸。氮气在焊接和石油精炼中也大有用武之地。
N,《DEATH NOTE》中的NEAR(尼亚) ,真名NATE RIVERNEAR,最接近L的天才少年,对付基拉的组织SPK的核心人物.
N在中文及现代汉语中的应用:
通常会听到有人说“我做了N遍”什么事情,在这里N代表了很多的意思,来源于高等数学中的微积分
在微积分中常用N来作为变数,如"N趋向于无穷","N趋近于0",等等
这个词的流行是在网络开始盛行的2001左右,应该出自于当时的大一大二学生中
我们常说N个实际上省略了后面一句N趋向于无穷,以夸张其数量的多,也有人说"N+1个",是同样的道理
如果您认为本词条还有待完善,需要补充新内容或修改错误内容,请迟族辩 编辑词条
参考资料:
1.《Death Note》
贡献者(共10名):
66225741、Freedom灬、VincentAi、山樱诗社、aaa6032、xxyunxiangxx、deanan、凭栏看剑、gxlzj、江安才子
本词条在以下词条中被提及:
L月、低氧化物、水花、J、尼亚、泥母、银河宇宙线、血凝素、来母、硫氮化物、齿龈鼻音、舌尖齿龈鼻辅音、整数、N字旗
“n”在英汉词典中的解释(来源:网络词典):
N
KK: []
DJ: []
n.
1. 英语字母中的第十四个字母,小写为n
n
KK: []
DJ: []
n.
你该了解下
10. 利用《数据结构》课程知识完成C语言程序设计“N皇后问题”(堆栈,一维数组,普通算法都可以,用C语言写
#include<stdio.h>//N皇后问题
#include<
stdlib.h
>
#include<stdio.h>
#include<
iostream.h
>
#include<
time.h
>
#include<dos.h>
#include<malloc.h>
typedefstruct{
int*elem;
intlength;
intlistsize;
}Sqlist;
intInitList(Sqlist&L){//初始化
L.elem=(int*)malloc(100*sizeof(int));
if(!L.elem)
return0;
L.length=0;
L.listsize=100;
return1;
}
intInsert(Sqlist&L,inte){//插入
intm=0,i=0;
int*p=&L.elem[0],*j=&L.elem[0];
if(L.length==0)
{*p=e;L.length++;return1;}
for(i;i<L.length;i++)
if(e>=*(p+i))
m=i+1;
for(i=L.length;i>m;i--)
*(j+i)=*(j+i-1);
L.elem[m]=e;
L.length++;
return1;
}
voidPrint(Sqlist&L,intn){//
遍历
打印输出
intk=1,i=0;int*p=&L.elem[0];
for(i=0;i<n*n;i++,k++){
printf("%d",*(p+i));
if(k==n){k=0;printf(" ");}}
printf(" ");
}
intReturnK(Sqlist&L,intk){//返回第K个元素的值
int*p=&L.elem[0];
return*(p+k-1);咐仿
}
voidFuK(Sqlist&L,intk,inte){//将第k个元素赋值为e
int*p=&L.elem[0];
*(p+k-1)=e;
}
intTiaoJian(SqlistL,intn,int&e){//是否满足皇后问题判断
intb[100];
intm=0,h=2*n;
for(intk=0;k<2*n;k++)b[k]=0;
for(inti=1;i<=n*n;i++)
if(ReturnK(L,i)==1)
{b[m]=(i-1)/n+1;m++;b[m]=i-(b[m-1]-1)*n;m++;}
for(intc=0;c<2*n;c++)
if(b[c]==0){h=c;break;}
for(c=0;c<h-2;c=c+2)
for(intd=c+2;d<h;d=d+2)
if(b[c]==b[d]||b[c+1]==b[d+1]||b[d+1]-b[c+1]==b[d]-b[c]||b[d+1]-b[c+1]==b[c]-b[d])
return0;
if(h==2*n){
printf(" %d皇后问题第%d个排列衡告纤! ",n,e);e++;
}
return1;
}
voidTrial(Sqlist&L,inti,intn,int&e){//皇后问题
intj;
if(i>n){Print(L,n);}
elsefor(j=1;j<=n;j++){
FuK(L,n*i-n+j,1);
if(TiaoJian(L,n,e)==1)
Trial(L,i+1,n,e);
FuK(L,n*i-n+j,0);
}
}
voidmain(){
intk,i=0;
printf(" 请输入要n皇后问题个数: ");
scanf("%d",&k);
time_trawtime;
structtm
*timeinfo;
time(友饥&rawtime);
timeinfo=localtime(&rawtime);
SqlistL1;
InitList(L1);
for(i=0;i<k*k;i++)
Insert(L1,0);
inte=1;
Trial(L1,1,k,e);
printf("Thecurrentdate/timeis:%s",asctime(timeinfo));
time(&rawtime);
timeinfo=localtime(&rawtime);
printf("Thecurrentdate/timeis:%s",asctime(timeinfo));
printf("哈哈哈哈(^o^)/~ ");
system("pause");
}