华数彩虹box_华数彩虹box打不开
1 2024-11-10 09:54:46
#include
八皇后问题python 八皇后问题python遗传算法
八皇后问题python 八皇后问题python遗传算法
int m=0,n; //m为摆法计数,n为皇后个数
int a;
int fit(int i, int j) //检查(i,j)上能否放棋子
{int j1=j, i1=i, ok1=1; //检查第i行上能否放棋子
while( (j1>1)&&ok1)
{j1--;
ok1=a[j1]!=i ;
}j1=j; i1=i; //检查对角线上能否放棋子
while( (j1>1)&&(i1>1)&&ok1)
{j1--;
i1--;
ok1=a[jint main(int argc, char argv[])1]!=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); label[m][j]=num;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; //在(i,j)上放一个棋子 queen(j+1) ; }} void main() {printf("请输入皇后棋子的个数n:n"); scanf("%d",&n); //n为皇后个数 a = new int[n]; queen(1); } 表示一个算法常用的方法有分治法、动态规划、贪心法和回溯法。 一、分治法 定义:分治法是一种将问题分解成若干个子问题然后逐个解决的方法。每个子问题的解合并起来,最终得到原问题的解。步骤:分解:将原问题分解为若干个规模较小的子问题。解决:递归地求解各个子问题。合并:将各个子问题的解合并成原问题的解。 二、动态规划 定义:动态规划是通过将问题分解为相互重叠的子问题来求解的一种方法。它保存子问题的解,避免重复计算,以提高效率。 步骤:确定状态:确定问题可以通过哪些状态来描述。定义状态转移方程:找到问题的递推关系,即当前状态与之前某些状态之间的关系。确定边界条件:确定初始状态的值或边界情况下的解。计算顺序:按照一定的顺序计算各个子问题的解。 三、贪心法 定义:贪心法是一种通过每一步选择当前解,以期望获得全局解的方法。它不考虑未来的情况,只关注眼前能够得到的解。 步骤:选择贪心策略:根据问题的特性和约束条件,选择每一步的解。判断可行性:验证所选择的解是否满足问题的约束条件。更新解空间:更新问题的解空间,继续进行下一步的选择。 四、回溯法 定义:回溯法是一种通过尝试所有可能的解,并在搜索过程中剪枝来求解问题的方法。它适用于各种组合、排列、子集等类型的问题。步骤:选择路径:从初始状态开始,选择一个合适的路径,进入下一层状态。探索路径:在当前状态下,沿着路径向前探索并搜索#include 结果判断:判断当前路径是否为有效解,如果是则记录,如果不是则返回上一层状态并继续探索其他路径。剪枝作:根据问题的特点,在搜索过程中剪除不符合要求的路径,减少搜索空间。 拓展知识: 分治法:在排序算法(如归并排序和快速排序)中常用分治法来提高效率,也广泛应用于各种图形处理问题。动态规划:动态规划算法被广泛应用于最短路径问题、背包问题、序列比对等领域。贪心法:贪心法常用于任务调度、图的遍历、覆盖等问题。回溯法:回溯法常用于搜索问题,如八皇后问题、数独等。 “对角线有两个方向”,他的意思是斜线方向。 象棋是88 = 64个格子,横着编号abcde。。。。纵向编号123456.。。。。。。 故任意格子都有一个的编号例如e3. 你可以把它翻译成坐标(5,3)。如果此格子站着皇后,5+3 = 8,5-3 = 2. 则(4,4)(3,5)等格子和(6,4)(7,5)等格子都不能再站皇后了。这些格子的flag将设为不能站皇后。 (1)全排列 将自然数1~n进行排列,共形成n!中排列方式,叫做全排列。 例如3的全排列是:1/2/3、1/3/2、2/1/3、2/3/1、3/1/2、3/2/1,共3!=6种。 (2)8皇后(或者n皇后) 保证8个皇后不能互相攻击,即保证每一横行、每一竖行、每一斜行最多一个皇后。 我们撇开第三个条件,如果每一横行、每一竖行都只有一个皇后。 将88棋盘标上坐标。我们讨论其中的一种解法: - - - - - - - Q - - - Q - - - - Q - - - - - - - - - Q - - - - - - Q - - - - - - - - - - - - Q - - - - - Q - - - 如果用坐标表示就是:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5) 将横坐标按次序排列,纵坐标就是8/4/1/3/6/2/7/5。这就是1~8的一个全排列。 我们将1~8的全排列存入输入a[]中(a[0]~a[7]),然后8个皇后的坐标就是(i+1,a[i]),其中i为0~7。 这样就能保证任意两个不会同一行、同一列了。 置于斜行,你知道的,两个点之间连线的斜率为1或者-1即为同一斜行,充要条件是|x1-x2|=|y1-y2|(两个点的坐标为(x1,y1)(x2,y2))。我们在输出的时候进行判断,任意两个点如果满足上述等式,则判为失败,不输出。 下面附上代码:添加必要的注释,其中全排列的实现看看注释应该可以看懂: #include #include #include #include int printed; //该函数用于画图,这里为了节约空间则略去 //读者只需要将draw(a,k);去掉注释即可画图 void draw(int a,int k) {int i,j; for(i=0;i {printf("t"); for(j=0;j //有皇后输出Q,否则输出- if(a[i]-1==j) printf("Q "); else printf("- "); printf(" "); }printf(" "); }//递归实现全排列,a是数组,iStep是位置的测试点,k是皇后的个数,一般等于8 void Settle(int a,int iStep,int k) {int i,j,l,flag=1; //如果iStep的数字等于a之前的数字,则存在重复,返回 for(i=0;i if(a[iStep-1]==a[i]) return; //如果iStep==k,即递归结束到一位,可以验证是否斜行满足 if(iStep==k) {//双重循环判断是否斜行满足 for(j=0;j for(l=0;l //如果不满足,则flag=0 if(fabs(j-l)==fabs(a[j]-a[l])) flag=0; //如果flag==1,则通过了斜行的所有测试,输出。 {for(i=0;i printf("(%d,%d) ",i+1,a[i]); printf(" "); //如果去掉这里的注释可以获得画图,由于空间不够,这里略去 // draw(a,k); //printed变量计算有多printf("%dn",num);少满足题意的结果,是全局变量 printed++; }flag=1; }//如果未测试至末尾,则测试下一位(递归) for(i=1;i<=k;i++) {a[iStep]=i; Settle(a,iStep+1,k); }} void main() {int a; int k; //输入维数,建立数组 printf("Enter the size of the square:"); scanf("%d",&k); a=(int)calloc(k,sizeof(int)); //清屏,从iStep=0处进入递归 ("cls"); Settle(a,0,k); //判断是否有结果 if(! printed) printf("No answers accepted! "); else printf("%d states ailable! ",printed); }附输出结果(输入k=8): (1,1) (2,5) (3,8) (4,6) (5,3) (6,7) (7,2) (8,4) (1,1) (2,6) (3,8) (4,3) (5,7) (6,4) (7,2) (8,5) (1,1) (2,7) (3,4) (4,6) (5,8) (6,2) (7,5) (8,3) (1,1) (2,7) (3,5) (4,8) (5,2) (6,4) (7,6) (8,3) (1,2) (2,4) (3,6) (4,8) (5,3) (6,1) (7,7) (8,5) (1,2) (2,5) (3,7) (4,1) (5,3) (6,8) (7,6) (8,4) (1,2) (2,5) (3,7) (4,4) (5,1) (6,8) (7,6) (8,3) (1,2) (2,6) (3,1) (4,7) (5,4) (6,8) (7,3) (8,5) (1,2) (2,6) (3,8) (4,3) (5,1) (6,4) (7,7) (8,5) (1,2) (2,7) (3,3) (4,6) (5,8) (6,5) (7,1) (8,4) (1,2) (2,7) (3,5) (4,8) (5,1) (6,4) (7,6) (8,3) (1,2) (2,8) (3,6) (4,1) (5,3) (6,5) (7,7) (8,4) (1,3) (2,1) (3,7) (4,5) (5,8) (6,2) (7,4) (8,6) (1,3) (2,5) (3,2) (4,8) (5,1) (6,7) (7,4) (8,6) (1,3) (2,5) (3,2) (4,8) (5,6) (6,4) (7,7) (8,1) (1,3) (2,5) (3,7) (4,1) (5,4) (6,2) (7,8) (8,6) (1,3) (2,5) (3,8) (4,4) (5,1) (6,7) (7,2) (8,6) (1,3) (2,6) (3,2) (4,5) (5,8) (6,1) (7,7) (8,4) (1,3) (2,6) (3,2) (4,7) (5,1) (6,4) (7,8) (8,5) (1,3) (2,6) (3,2) (4,7) (5,5) (6,1) (7,8) (8,4) (1,3) (2,6) (3,4) (4,1) (5,8) (6,5) (7,7) (8,2) (1,3) (2,6) (3,4) (4,2) (5,8)// }; (6,5) (7,7) (8,1) (1,3) (2,6) (3,8) (4,1) (5,4) (6,7) (7,5) (8,2) (1,3) (2,6) (3,8) (4,1) (5,5) (6,7) (7,2) (8,4) (1,3) (2,6) (3,8) (4,2) (5,4) (6,1) (7,7) (8,5) (1,3) (2,7) (3,2) (4,8) (5,5) (6,1) (7,4) (8,6) (1,3) (2,7) (3,2) (4,8) (5,6) (6,4) (7,1) (8,5) (1,3) (2,8) (3,4) (4,7) (5,1) (6,6) (7,2) (8,5) (1,4) (2,1) (3,5) (4,8) (5,2) (6,7) (7,3) (8,6) (1,4) (2,1) (3,5) (4,8) (5,6) (6,3) (7,7) (8,2) (1,4) (2,2) (3,5) (4,8) (5,6) (6,1) (7,3) (8,7) (1,4) (2,2) (3,7) (4,3) (5,6) (6,8) (7,1) (8,5) (1,4) (2,2) (3,7) (4,3) (5,6) (6,8) (7,5) (8,1) (1,4) (2,2) (3,7) (4,5) (5,1) (6,8) (7,6) (8,3) (1,4) (2,2) (3,8) (4,5) (5,7) (6,1) (7,3) (8,6) (1,4) (2,2) (3,8) (4,6) (5,1) (6,3) (7,5) (8,7) (1,4) (2,6) (3,1) (4,5) (5,2) (6,8) (7,3) (8,7) (1,4) (2,6) (3,8) (4,2) (5,7) (6,1) (7,3) (8,5) (1,4) (2,6) (3,8) (4,3) (5,1) (6,7) (7,5) (8,2) (1,4) (2,7) (3,1) (4,8) (5,5) (6,2) (7,6) (8,3) (1,4) (2,7) (3,3) (4,8) (5,2) (6,5) (7,1) (8,6) (1,4) (2,7) (3,5) (4,2) (5,6) (6,1) (7,3) (8,8) (1,4) (2,7) (3,5) (4,3) (5,1) (6,6) (7,8) (8,2) (1,4) (2,8) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5) (1,4) (2,8) (3,1) (4,5) (5,7) (6,2) (7,6) (8,3) (1,4) (2,8) (3,5) (4,3) (5,1) (6,7) (7,2) (8,6) (1,5) (2,1) (3,4) (4,6) (5,8) (6,2) (7,7) (8,3) (1,5) (2,1) (3,8) (4,4) (5,2) (6,7) (7,3) (8,6) (1,5) (2,1) (3,8) (4,6) (5,3) (6,7) (7,2) (8,4) (1,5) (2,2) (3,4) (4,6) (5,8) (6,3) (7,1) (8,7) (1,5) (2,2) (3,4) (4,7) (5,3) (6,8) (7,6) (8,1) (1,5) (2,2) (3,6) (4,1) (5,7) (6,4) (7,8) (8,3) (1,5) (2,2) (3,8) (4,1) (5,4) (6,7) (7,3) (8,6) (1,5) (2,3) (3,1) (4,6) (5,8) (6,2) (7,4) (8,7) (1,5) (2,3) (3,1) (4,7) (5,2) (6,8) (7,6) (8,4) (1,5) (2,3) (3,8) (4,4) (5,7) (6,1) (7,6) (8,2) (1,5) (2,7) (3,1) (4,3) (5,8) (6,6) (7,4) (8,2) (1,5) (2,7) (3,1) (4,4) (5,2) (6,8) (7,6) (8,3) (1,5) (2,7) (3,2) (4,4) (5,8) (6,1) (7,3) (8,6) (1,5) (2,7) (3,2) (4,6) (5,3) (6,1) (7,4) (8,8) (1,5) (2,7) (3,2) (4,6) (5,3) (6,1) (7,8) (8,4) (1,5) (2,7) (3,4) (4,1) (5,3) (6,8) (7,6) (8,2) (1,5) (2,8) (3,4) (4,1) (5,3) (6,6) (7,2) (8,7) (1,5) (2,8) (3,4) (4,1) (5,7) (6,2) (7,6) (8,3) (1,6) (2,1) (3,5) (4,2) (5,8) (6,3) (7,7) (8,4) (1,6) (2,2) (3,7) (4,1) (5,3) (6,5) (7,8) (8,4) (1,6) (2,2) (3,7) (4,1) (5,4) (6,8) (7,5) (8,3) (1,6) (2,3) (3,1) (4,7) (5,5) (6,8) (7,2) (8,4) (1,6) (2,3) (3,1) (4,8) (5,4) (6,2) (7,7) (8,5) (1,6) (2,3) (3,1) (4,8) (5,5) (6,2) (7,4) (8,7) (1,6) (2,3) (3,5) (4,7) (5,1) (6,4) (7,2) (8,8) (1,6) (2,3) (3,5) (4,8) (5,1) (6,4) (7,2) (8,7) (1,6) (2,3) (3,7) (4,2) (5,4) (6,8) (7,1) (8,5) (1,6) (2,3) (3,7) (4,2) (5,8) (6,5) (7,1) (8,4) (1,6) (2,3) (3,7) (4,4) (5,1) (6,8) (7,2) (8,5) (1,6) (2,4) (3,1) (4,5) (5,8) (6,2) (7,7) (8,3) (1,6) (2,4) (3,2) (4,8) (5,5) (6,7) (7,1) (8,3) (1,6) (2,4) (3,7) (4,1) (5,3) (6,5) (7,2) (8,8) (1,6) (2,4) (3,7) (4,1) (5,8) (6,2) (7,5) (8,3) (1,6) (2,8) (3,2) (4,4) (5,1) (6,7) (7,5) (8,3) (1,7) (2,1) (3,3) (4,8) (5,6) (6,4) (7,2) (8,5) (1,7) (2,2) (3,4) (4,1) (5,8) (6,5) (7,3) (8,6) (1,7) (2,2) (3,6) (4,3) (5,1) (6,4) (7,8) (8,5) (1,7) (2,3) (3,1) (4,6) (5,8) (6,5) (7,2) (8,4) (1,7) (2,3) (3,8) (4,2) (5,5) (6,1) (7,6) (8,4) (1,7) (2,4) (3,2) (4,5) (5,8) (6,1) (7,3) (8,6) (1,7) (2,4) (3,2) (4,8) (5,6) (6,1) (7,3) (8,5) (1,7) (2,5) (3,3) (4,1) (5,6) (6,8) (7,2) (8,4) (1,8) (2,2) (3,4) (4,1) (5,7) (6,5) (7,3) (8,6) (1,8) (2,2) (3,5) (4,3) (5,1) (6,7) (7,4) (8,6) (1,8) (2,3) (3,1) (4,6) (5,2) (6,5) (7,7) (8,4) (1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5) Program queen; var a,b,c,d,e,f,g,h:1..8; begin for a:for c:= 1 to 8 do= 1 to 8 do for b := 1 to 8 do if a<>b then if (a<>c) and (b<>c) then for d:= 1 to 8 do if ..... then for ... := 1 to 8 do if .... then ...... for h := 1 to 8 do if (a<>h) and (b<>h)..... then begin if ..... then write(...) end; 条件懒得写了 1楼貌似递归.... 建议:多用几个for吧 这样算是解 class Queen8{ static int oktimes = 0; static int chess[] = new int[QueenMax]; public static void main(String args[]){ for (int i=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 chess[num]=i; placequeen(num+1); }else{ //num is last one chess[num]=i; System.out.println("这是第"+oktimes+"个解法 如下:"); System.out.println("第n行: 1 2 3 4 5 6 7 8"); for (i=0;i String row="第"+(i+1)+"行: "; else for(int j=0;j row+="++"; int j = chess[i]; while(j System.out.println(row); }} }} } 没想法了 课本上应该有吧 找本C++的书看看行了 百度算法名,加上if (chess[i]==0);八皇后 比如 BFS 八皇后问题 C语言。 或者 遗传算法 八皇后问题 C语言 然后根据搜索结果 就可以得到算法和代码了。 //应该可以一个搞定 / f(x,n)=x-x^}while(j 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 a,b; while(1) {("cls"); printf("请输入x,n的值n"); scanf("%d %d",&a,&b); if(a<=0||b<=0) {exit(0); }else {printf("%dn",fun(a,b)); Sleep(1500); }} return 0; }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); } #include "stdio.h" #include "windows.h" #define N 8 / 定义棋盘大小 / int place(int k); / 确定某一位置皇后放置与否,放置则返回1,反之返回0 / void backtrack(int i);/ 主递归函数,搜索解空间中第i层子树 / void chesoard(); / 每找到一个解,打印当前棋盘状态 / static int sum, /{Output(); 当前已找到解的个数 / x[N]; / 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 / int main(void) {backtrack(0); ("pause"); return 0; }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; return 1; }void backtrack(int t) {/ t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 / else for (int i = 0; i < N; i ++) { x[t] = i; if (#include }} 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"); } 这个题目用递归的方法呢,想楼上的那样。 直接给你pascaif(flag)l的源程序。 program eightqueens; var x:array[1..8] of intgeer; a,b,c:array[-7..16] of boolean; q:boolean; procedure print; var i:integer; beginif(Queens == 8)/递归结束条件/ for i:=1 to 8 fo write(x[i]:2); inc(coint); wrin('count=',count); end; procedure try(i:integer); var 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; c[i-j]:=true' b[i+j]:=true; end; end;end; begin for i:=1 to 8 do for i:=-7 to 7 do c[i]:=true; for i:=2 to 16 do b[i]:=true; count:=0; try(1); end. 时空复杂度没超过noip竞赛的要求。表示一个算法常用的方法有哪四种
printf("(%d,%d)n",i,j);八皇后对角线问题,这句话没看懂……
92 states ailable!求教C语言回溯法写出八皇后问题的92种解
求~~~pascal八皇后 非递归详细算法和程序
{if(label[c-1][i]==0)//存在可以放置第c个皇后的位置求八皇后问题C++程序设计
- - - - - Q - -用C语言编写三个算法,BFS或DFS,爬山算法,遗传算法实现八皇后问题
for (int j = 0; j < k; j ++)求公式的递归函数
//小于3x3的棋盘是无解的用C语言编写八皇后问题
我想知道八皇后问题的空间和时间复杂度,以及计算过程,谢谢