Ka的回溯编程练习 Part2|八皇后问题

 1 #include <stdio.h>
 2 int AChessBlockRecorder[10]={0}/*下标层数,内容竖行*/,ThisIsMyPlace[10]={0};/*占领*/
 3 int TheTalentOfTheQueen1[25]={0};  //前一个维度代表主对角线特性,相减同
 4 int TheTalentOfTheQueen2[25]={0};
 5 int total=0;
 6 void output()
 7 {
 8     total++;
 9     printf("solotion:<%d>---\n",total);
10     int q,w;
11     for(q=1;q<9;q++)
12     {
13         for(w=1;w<9;w++)
14                 AChessBlockRecorder[q]==w?printf("☆"):printf("★");
15         printf("\n");
16     }
17 }
18 int search(int n)
19 {
20     int i;
21     for(i=1;i<=8;i++)
22     {
23         if(ThisIsMyPlace[i]==0&&TheTalentOfTheQueen1[i-n+8]==0&&TheTalentOfTheQueen2[i+n]==0) //此竖行尚未被皇后占领
24         {
25             AChessBlockRecorder[n]=i;
26             ThisIsMyPlace[i]=1;
27             TheTalentOfTheQueen1[i-n+8]=1;
28             TheTalentOfTheQueen2[i+n]=1;
29             if(n==8) output();
30             else search(n+1);
31             TheTalentOfTheQueen1[i-n+8]=0;
32             TheTalentOfTheQueen2[i+n]=0;
33             ThisIsMyPlace[i]=0;
34         }
35     }
36 }
37 int main()
38 {
39     freopen("o.txt","w",stdout);
40     search(1);
41     return 0;
42 }

算是回溯中比较基本的了。

时间: 2024-12-14 06:27:20

Ka的回溯编程练习 Part2|八皇后问题的相关文章

回溯算法--八皇后问题

问题描述:八皇后不能相互攻击,即,八个皇后不能同行,同列,不同在同一条对角线上, 对角线又可以分为左对角线和右对角线 左对角线上满足:i-j+7都相等(i,j分别是一维和二维的坐标) 右对角线满足:i+j 都相等 代码如下: #include <iostream> using namespace std; int e_q[8][8]; int r[15]; int le[15]; int q[8]; int count = 0; void en_queens(int); int main()

Ka的回溯编程练习 Part3|马的遍历

1 #include <stdio.h> 2 int board[100][3]={0},totally=0; 3 int x[4]={2,1,-1,-2},y[4]={1,2,2,1}; 4 void o(int k) //这个输出函数需要借助回溯中n的值来完成输出 5 { 6 totally++; 7 printf("%d:",totally); 8 int r; 9 for(r=1;r<=k-1;r++) 10 printf("|%d,%d|->

Ka的回溯编程练习 Part5|跳马,又名马的遍历2

1 #include <stdio.h> 2 int TheEarthLand[6][6]={0}; 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1}; 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2}; 5 int total=0; 6 void op() 7 { 8 total++; 9 printf("<Way%d>:\n",total); 10 int i,j; 11 for(i=1;i&l

Ka递归的编程练习 Part2|做到吐的正序逆序输出、等差数列和

1 #include<stdio.h> 2 void PP(int n) 3 { 4 if(n==0) return; 5 PP(n/10); 6 printf("%d",n%10); 7 } 8 void NP(int n) 9 { 10 if(n==0) return; 11 printf("%d",n%10); 12 PP(n/10); 13 } 14 int Ad(int n) 15 { 16 if(n==0) return 0; 17 if(n

Ka的回溯编程练习 Part6|有重复元素的排列问题

第一个问题: 有红球4个,白球3个,黄球3个,将它们排成一排共有多少种排法 #include <stdio.h> int BallsIUsed[201]; int BallsIHave[201]={0}; int total=0; int k; void op() { int i; total++; printf("%d:",total); for(i=1;i<=k;i++) { printf("%c",BallsIUsed[i]); } prin

Ka的回溯编程练习 Part4|分配工作

设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下. 每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出. 这个主要是细节了,没什么难度 1 #include<stdio.h> 2 int MansToJobs[6][6]={{0,0,0,0,0,0},{0,13,11,10,4,7},{0,13,10,10,8,5},{0,5,9,7,7,4},{0,15,12,10,11,5},{0,10,11,8,8,4}}; 3

Ka的回溯编程练习 Part6.5|详解|有重复元素的排列问题

#include <stdio.h> #define br printf("\n"); int ans=0; char el[502]; int confirm(int i,int k) //往回比较,如果元素有相同跳过此情况 { if(i>k) { while(i>k) { if(el[i]==el[k]) return 0; k++; } } return 1; } void op(int n) { ans++; int j; for(j=0;j<=n

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

八皇后解法(回溯法)

package com.company; /** * Created by Administrator on 2016/9/15. */public class EigthQueue { private static int N = 8; private int count = 0; // 总方案数 private int[] flag = {-1, -1, -1, -1, -1, -1, -1, -1}; //回溯法递归实现八皇后问题 //输出棋盘 private void printChes