八皇后问题python 八皇后问题python回溯法
求公式的递归函数
printf("n");//应该可以一个搞定
八皇后问题python 八皇后问题python回溯法
八皇后问题python 八皇后问题python回溯法
(1,4) (2,7) (3,5) (4,2) (5,6) (6,1) (7,3) (8,8)
/
printf("请输入x,n的值n");f(x,n)=x-x^2+x^3-x^4+···+(-1)^(n-1)x^n
f(x,n-1)=x-x^2+x^3-x^4+···+(-1)^(n-2)x^(n-1)
(-x)f(x,n-1)=-x^2+x^3-x^4+……(-1)^(n-1)x^n=f(x,n)-x
f(x,n)=x-xf(x,n-1)
f(x,1)=x
/
#include "stdafx.h"
#include
#include
#include
long int fun(int,int);
int main(int argc, char argv[])
{int a,b;
while(1)
{("cls");
scanf("%d %d",&a,&b);
if(a<=0||b<=0)
{exit(0);
}else
{printf("%dn",fun(a,b));
Sleep(1500);
}long int fun(int x,int n)
{static long int r=x;
if(n==1)
{r=x;
}else
{r=x-(xfun(x,n-1));
}return r;
f(x,n) {
if (n==-1) return 0;
else return (-1)^(n-1)x^n + f(x,n-1);
我想知道八皇后问题的空间和时间复杂度,以及计算过程,谢谢
cout<<"8皇后可能的结果:"<program eightqueens;
x:array[1..8] of intgeer;
a,b,c:array[-7..16] of boolean;
i,count:integer;
q:boolean;
procedure print;
i:integer;
beg(1,6) (2,3) (3,1) (4,8) (5,4) (6,2) (7,7) (8,5)in
for i:=1 to 8 fo
write(x[i]:2);
ifor(j=0;j<8;j++)nc(coint);
wrin('count=',count);
end;
j:integer;
begin
for j:=1 to 8 do
begin
if a[j] and c[i-j] and b[i+j] then
begin
x[i]:=j;
a[j]:=false;
c[i-j]:=false;
b[i+j]:=false;
if i<8 then try (i+1)
else print;
a[j]:=true;
b[i+j]:=true;
end; end;end;
begin
for i:=1 to 8 do
a[i]:=true;
for i:=-7 to 7 do
c[i]:=true;
for i:=2 to 16 do
b[i]:=true;
count:=0;
try(1);
end.
时空复杂度没超过noip竞赛的要求。
求八皇后问题C++程序设计
for(k=0;kclass Queen8{
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];
public static void main(String args[]){
for (int i=for (int j = 0; j < k; j ++)0;i placequeen(0); System.out.println("nnn八皇后共有"+oktimes+"个解法 made by yifi 2003"); }public static void placequeen(int num) {int i=0; boolean qse[] = new boolean[QueenMax]; for(;i i=0; while (i qse[chess[i]]=false; int k=num-i; if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) qse[chess[i]+k]=false; if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) qse[chess[i]-k]=false; i++; }for(i=0;i if (qse[i]==false)continue; if (num // 0,0,0,0,0,0,0,chess[num]=i; placequeen(num+1); }else{ //num is last one chess[num]=i; oktimes++; System.out.println("这是第"+oktimes+"个解法 如下:"); System.out.println("第n行: 1 2 3 4 5 6 7 8"); for (i=0;i String row="第"+(i+1)+"行: "; if (chess[i]==0); else for(int j=0;j row+="++"; int j = chess[i]; while(j System.out.println(row); 没想法了 课本上应该有吧 找本C++的书看看行了 Program queen; a,b,c,d,e,f,g,h:1..8; begin for a:= 1 to 8 do for b := 1 to 8 do if a<>b then for c:= 1 to 8 do if (a<>c) and (b<>c) then for d:= 1 to 8 do for ... := 1 to 8 do if .... then ...... for h := 1 to 8 do if (a<>h) and (b<>h)..... then begin write(...) end; 条件懒得写了 1楼貌似递归.... 建议:多用几个for吧 int m=0,n; //m为摆法计数,n为皇后个数 int a; int fit(int i, int j) //检查(i,j)上能否放棋子 {int j1=j,{for(k=0;k while( (j1>1)&&ok1) {j1--; ok1=a[j1]!=i ; }j1=j; i1=i; //检查对角线上能否放棋子 while( (j1>1)&&(i1>1)&&ok1) {j1--; i1--; ok1=a[j1]!=i1 ; }j1=j; i1=i; //检查另一对角线上能否放棋子 while( (j1>1)&&(i1 {j1--; i1++; ok1=a[j1]!=i1 ; }return ok1; }void queen(int j) //从第j列开始逐个试探 {if (j>n) {m++; printf("放法%d ",m); for (int i=1;i<=n;i++) printf(" (%d,%d)",a[i],i); printf("n"); }else for( int i=1; i<=n;i++) if(fit(i,j)) //检查(i,j)上能否放棋子 {a[j]=i; //在(1,5) (2,3) (3,1) (4,7) (5,2) (6,8) (7,6) (8,4)(i,j)上放一个棋子 {printf("请输入皇后棋子的个数n:n"); scanf("%d",&n); //n为皇后个数 a = new int[n]; queen(1); #include #include #include #include using namespace std; bool d[17]={0},b[9]={0},c[17]={0};//下标用到16,数组必须开到17才行 int sum=0,a[9]; int search(int); int print(); int main() {search(1); //放第1个皇后 }int search(int i) {int j;for(j=1;j<=8;j++) //穷举每一行上的8个位置 {if((!b[j])&&(!c[i+j])&&(!d[i-j+7])) //若列上、左斜线、右斜线均不冲突 {a[i]=j; //第i行的皇后放在第j列上 b[j]=1; //封锁第j列 c[i+j]=1; //封锁左斜线 d[i-j+7]=1; //封锁右斜线 if(i==8) //若第8行已放好 {print(); //就打印 }else {search(i+1); //否则入下一行 }b[j]=0; //本行皇后重放:连同本行,以下三行回溯,解除封锁 c[i+j]=0; d[i-j+7]=0; }int pr//!依次输出各个列上的皇后的位置,即所在的行数。int() //打印 sum++; cout<<"sum="< for(i=1;i<=8;i++) //输出每一行的皇后放在第几列 {cout< (1,5) (2,8) (3,4) (4,1) (5,3) (6,6) (7,2) (8,7)}cout< 象棋皇后的走法如下: 走法非常简单的棋,横竖斜都可以进行移动,受到的限制条件较小,因此移动的范围非常的广,除了不能越过其他的棋子,在棋盘上基本可以随便移动,灵活性成为了皇后这款棋子的优势。 皇后的吃子方式很简单,不像是士兵要直走斜吃,皇后可以行棋如吃子,没有的吃子方式,士兵是吃子方式独特,马是行棋方法独特,皇后都没有这些限制。除了越子这一项以外皇后吃子行棋几乎没有限制,而无法越子也并不是皇后的限制,“象”,“车”等等都不可以越子。 八皇后问题就是在棋面上摆放八颗皇后棋子,然后让它们的走法不要冲突,也就是每一颗棋子的走法路径都。那么,这个摆放棋子的问题就成了一个算法问题。八皇后问题,是一个古老而的问题,是回溯算法的典型案例。 该问题是西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认(1,5) (2,7) (3,2) (4,6) (5,3) (6,1) (7,8) (8,4)为有76种方案。1854年在柏林的象棋杂志{/ t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 /上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。 #include "stdio.h" #include "windows.h" #define N 8 / 定义棋盘大小 / int place(int k); / 确定某一位置皇a[1]=1;/为数组的个元素赋初值/后放置与否,放置则返回1,反之返回0 / void backtrack(int i);/ 主递归函数,搜索解空间中第i层子树 / void chesoard(); / 每找到一个解,打印当前棋盘状态 / static int sum, / 当前已找到解的个数 / x[N]; / 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 / int main(void) {backtrack(0); ("pause"); }int place(int k) {/ 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == / / x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 / / 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。/ if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0; }void backtrack(int t) if (t == N) chesoard(); else for (int i = 0; i < N; i ++) { x[t] = i; if (place(t)) backtrack(t + 1); void chesoard() {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"); 这个题目用递归的方法呢,想楼上的那样。 百度算法名,加上八皇后 比}如 BFS 八皇后问题 C语言。 或者 遗传算法 八皇后问题 C语言 然后根据搜索结果 就可以得到算法和代码了。 回溯法:八皇后问题,一个经典问题 在程序设计中还有一种方法叫做"回溯法".他不是按照某种公式或确定的法则,求问题的解,而是通过试探和纠正错误的策略,找到问题的街.这种方法一般是从一个原始状态出发,通过若干步试探,达到目标状态终止. 回溯法在理论上来说,就是在一棵搜索树中从根结点出发,找到一条达到满足某条件的子结点的路径.在搜索过程中,对于每一个中间结点,他的位置以及向下搜索过程是相似的,因此完全可以用递归来处理.典型的例子就是的"八皇后问题". "八皇后问题"是在象棋棋盘上放置八个皇后,使她们不能相吃.象棋中的皇后可以吃掉与她处于同一行,同一列,同一对角线上的棋子.因此每一行只能摆放一个皇后.因共有八行,所以每行有且只有一个皇后. 在本例中皇后的位置有一个一维数组来存放A(I)=J表示第I行皇后放在第J列.下面主要来看看怎么样判断皇后是否安全的问题.(1)首先,用一维数组来表示,已经解决了不在同一行的问题.(2)对于列可以引进一个标志数组C[J],若J列上已放了皇后,则C[J]=FALSE.(3)对于左上右下的对角线I-J为一常量,位于[-7,+7]之间,再此引入标志数组L[-7..7];对于左下右上的对角线,类似的有I+J等于常量,用数组R[2..16]来表示.当在第I行,第J列上放置了皇后,则只需设置:C[J]:=FALSE; L[I-J]:=FLASE; R[I+J]:=FALSE就可以解决皇后的安全问题了. 问题描述:在标准象棋的棋盘上(88格)准备放置8只皇后,我们知道,象棋中皇后的威力是的,她既可以横走竖走,还可以斜着走,遇到挡在她前进路线上的敌人,她就可以吃掉对手。要求在棋盘上安放8只皇后,使她们彼此互相都不能吃到对方,求皇后的放法。 // / / / 问题:在8×8的象棋棋盘上放置8个皇后,要求任意两个皇后 / / 不能在同一行、同一列或同一条对角线上。 / / / / 本程序使用递归-回溯法求解8皇后问题。Visual C++ 6.0 调试通过。 / / 作者 晨星 2002年5月9日 / / / // #include #include #include #define QUEENS 8 //!记录解的序号的全局变量。 int iCount = 0; //!记录皇后在各列上的放置位置的全局数组。 int Site[QUEENS]; //!递归求解的函数。 void Queen(int n); //!输出一个解。 void Output(); //!判断第n个皇后放上去之后,是否有冲突。 int IsValid(int n); /----------------------------Main:主函数。 ----------------------------/ {//!从第0列开始递归试探。 Queen(0); //!按任意键返回。 getch(); }/-----------------Queen:递归放置第n个皇后,程序的核心!----------------/ //!参数n从0开始,等于8时便试出了一个解,将它输出并回溯。 if(n == QUEENS) {Output(); return; }//!n还没到8,在第n列的各个行上依次试探。 for(i = 1 ; i <= QUEENS ; i++) {//!在该列的第i行上放置皇后。 Site[n] = i; //!如果放置没有冲突,就开始下一列的试探。 if(IsValid(n)) Queen(n + 1); /------IsValid:判断第n个皇后放上去之后,是否合法,即是否无冲突。------/ int IsValid(int n) //!将第n个皇后的位置依次于前面n-1个皇后的位置比较。 for(i = 0 ; i < n ; i++) {//!两个皇后在同一行上,返回0。 if(Site[i] == Site[n]) //!两个皇后在同一对角线上,返回0。 if(abs(Site[i] - Site[n]) == (n - i)) }//!没有冲突,返回1。 }/------------Output:输出一个解,即一种没有冲突的放置方案。------------/ void Output() //!输出序号。 printf("No.%-5d" , ++iCount); for(i = 0 ; i < QUEENS ; i++) printf("%d " , Site[i]); }STL源代码 用了STL, 方法是一样的. #include #include using namespace std; void queen(const string t, const string s) {if (s=="") cout< else for (int i=0; i bool safe=true; if (t.length()-j==abs(s[i]-t[j])) safe=false; }if (safe) queen(t+s[i], s.substr(0,i)+s.substr(i+1)); int main() {string s="01234567"; queen("",s); ("PAUSE"); exit(EXIT_SUCCESS); }递归解八皇后问题 /递归法解八皇后问题/ /作者黄国瑜,《数据结构(C语言版)》清华大学出版社/ char Chesoard[8][8]; /声明8*8的空白棋盘/ int N_Queens(int LocX, int LocY, int Queens) /递归/ {int i,j; int Result=0; if(Queens == 8)/递归结束条件/ else if(QueenPlace(LocX,LocY))/递归执行部分/ {Chesoard[LocX][LocY] = 'Q'; for(i=0;i<8;i++) {Result += N_Queens(i,j,Queens+1); if(Result>0) break; }if(Result>0) else {Chesoard[LocX][LocY] = 'X'; else }int QueenPlace(int LocX,int LocY) /判断传入坐标本身及入八个方向上是否有皇后/ {int i,j; if(Chesoard[LocX][LocY] != 'X') for(j=LocY-1;j>=0;j--) if(Chesoard[LocX][j] != 'X') for(j=LocY+1;j<8;j++) if(Chesoard[LocX][j] != 'X') for(i=LocX-1;i>=0;i--) if(Chesoard[i][LocY] != 'X') for(i=LocX+1;i<8;i++) if(Chesoard[i][LocY] != 'X') i= LocX - 1; j= LocY - 1; while (i>=0&&j>=0) if(Chesoard[i--][j--] != 'X') i= LocX + 1; j= LocY - 1; while (i<8&&j>=0) i= LocX - 1; j= LocY + 1; while (i>=0&&j<8) if(Chesoard[i--][j++] != 'X') i= LocX + 1; j= LocY + 1; while (i<8&&j<8) }main() /主程序/ {int i,j; for(i=0;i<8;i++) Chesoard[i][j] = 'X'; N_Queens(0,0,0); printf("the graph of 8 Queens on the Chesoard.is:n"); for(i=0;i<8;i++) {if(Chesoard[i][j] == 'Q') printf("(%d,%d)n",i,j); }getch(); }/ 八皇后问题 根据严书给的类c算法求得 / #define N 8 int col=1,row=1,slash=1,bslash=1; int a[N][N]; int p,q,k,l; int num=0; void trial(int i) {int j; /注 意,这里的j 一定要设为内部变量/ if(i==N) {num++; {for(l=0;l {if(a[k][l]==1) printf("@"); e1.线形表的类型定义lse printf(""); }printf("n"); }printf("nn"); getchar(); }else {for(j=0;j {col=0; break; } /列/ p=i-1; while((p>=0)&&(q {if(a[p][q]==1) {slash=0; break; }p--; q++; }p=i-1; q=j-1; /对角/ while((p>=0)&&(q>=0)) {if(a[p][q]==1) {bslash=0; break; }p--; q--; } /斜对角/ if((col==1)&&(slash==1)&&(bslash==1)) /条件判断/ {a[i][j]=1; trial(i+1); }col=1;slash=1;bslash=1; a[i][j]=0; }void main() {trial(0); printf("%d}}n",num); getchar();求~~~pascal八皇后 非递归详细算法和程序
if ..... then八皇后问题的数据结构课程设计
(1,6) (2,4) (3,7) (4,1) (5,8) (6,2) (7,5) (8,3)八皇后问题c++代码,求详解
(1,7) (2,4) (3,2) (4,8) (5,6) (6,1) (7,3) (8,5)象棋皇后的走法
c[i-j]:=true'用C语言编写八皇后问题
inse a[i]++;/将a[i]的值取下一个值/ printed;用C语言编写三个算法,BFS或DFS,爬山算法,遗传算法实现八皇后问题
return 0;八皇后c++源码讲解
// 0,0,0,0,
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。