八皇后究竟有多少种解法?怎么解?
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动,使教学能产生良好的效果。下面是用Turbo C实现的八皇后问题的图形程序,能够演示全部的92组解。八皇后问题动态图形的实现
有个用win tc编译的C程序求大神改错(八皇后问题)
- 由于程序太长无法直接发在问题里,有意者私聊发给你row;i++){for(j=0;jrow;i++){for(j=0;j
- jrow这就不对啊
八皇后问题,不知道哪里不对,编译没问题,就是没答案
- 八皇后问题,不知道哪里不对,编译没问题,就是没答案#include iostream.hint m[8][8]={0};int n甫搐颠诽郯赌奠涩订绩um=0;void print(){num++;coutnumendl; int i=0,j=0; for (i=0;i8;i++) { for(j=0;j8;j++)coutm[i][j]" "; coutendl; }}bool check(int row,int column){ if(row==0) return true; int i,j; for(i=0;irow;i++) { if(m[i][column]==1) return false; } while (row=0&&column=0) { row–;column–; if(m[row][column]==1)return false; } while(row=0&&column8) { row–;column++; if(m[row][column]==1)return false; } return true;}void eight (int row){ int j=0; for(j=0;j8;j++) { m[row][j]=1; if(check(row,j)==true) { if(row==7) print(); else eight(row+1); } else m[row][j]=0; }}int main (){ eight(0); return 0;}
- off in September l
八皇后问题 急求c语言编程大神帮忙解答下这题,并画上流程图,万分感谢!高悬赏~~~在线等,急
- 的犯罪类电影
八皇问题,任意两个皇后不在同一行和同一列上且不在同意(正方形)个对角线上求大神详解,特别是星号之间
- public class Exercise6_20 { public static void main(String[] args) { Queen positions int[] queens = new int[8]; queens are placed at (i, queens[i]) for (int i = 0; i 8; i++) queens[i] = -1; -1 indicates that no queen is currently placed in the ith row queens[0] = 0; Initially, place a queen at (0, 0) in the 0th row k – 1 indicates the number of queens placed so far We are looking for a position in the kth row to place a queen int k = 1; while (k = 0 && k = 7) { Find a position to place a queen in the kth row int j = findPosition(k, queens);************* if (j 0) { queens[k] = -1; k–; back track to the previous row } else { queens[k] = j; k++; }*************** } printResult(queens); } public static int findPosition(int k, int[] queens) {************** int start = queens[k] == -1 ? 0 : queens[k] + 1; for (int j = start; j 8; j++) { if (isValid(k, j, queens)) return j; (k, j) is the place to put the queen now } return -1; }******************* ** Return true if you a queen can be placed at (k, j) * public static boolean isValid(int k, int j, int queens[]) { See if (k, j) is a possible position Check jth column for (int i = 0; i k; i++) if (queens[i] == j) return false; Check major diagnol for (int row = k – 1, column = j – 1; row = 0 && column = 0; row–, column–) if (queens[row] == column) return false; Check minor diagnol for (int row = k – 1, column = j + 1; row = 0 && column = 7; row–, column++) if (queens[row] == column) return false; return true; } ** Print a two-dimensional board to display the queens * public static void printResult(int[] queens) { for (int i = 0; i 8; i++) System.out.println(i + ", " + queens[i]); System.out.println(); Display the output for (int i = 0; i 8; i++) { for (int j = 0; j queens[i]; j++)
- 思想:想象你面前一个8〤8的棋盘,要放8个皇后,因为同一行会攻击,所以,必然每行放置一个皇后。开始,我们采用从上到下,从左到右的顺序放置皇后。(!!一定跟着下面的描述模仿一下这个过程!!)第1行第1列放一个,然后看第2行,放一个,然后第3行,放一个……然后第5行,呃,没有合理位置,放不下了(这里假如矛盾出现在第5行),回到第4行,将第4行的皇后向右移,重新找一个合适的位置,然后继续第5行……直到8个皇后都放置好,成功了。你要解释的代码:第二段:求第k行中,皇后应放在第几列。 public static int findPosition(int k, int[] queens) {************** 从左向右试,queens[k]指当前皇后放在第几列。 若为-1,表示该行还没放皇后,从第0列开始试探 若不为-1,表示当前皇后放在queens[k]列,即前面的已经计算过了,所以继续试探下一列 int start = queens[k] == -1 ? 0 : queens[k] + 1; 从start到右边界,逐列验证是否可以放置皇后 for (int j = start; j 8; j++) { 若可以放置,则返回列下标 if (isValid(k, j, queens)) return j; (k, j) is the place to put the queen now } 没有可以放置的位置,返回-1表示。 return -1;}*******************第一段: Find a position to place a queen in the kth row 查找第k行的皇后可以放置在哪一列 int j = findPosition(k, queens);************* 返回-1,表示没有可以放置的位置 if (j 0) { queens[k] = -1;第k行的皇后没有放置 因为8行的话,必然每行一个皇后。 无法放置是不可能的,一定是前面放错了,导致矛盾了。 所以,回到前一行,重新修改前面的放置方案 k–; back track to the previous row } else { 若找到了位置,则将皇后暂且放在第j列 queens[k] = j; 继续看一下下一行应该怎么放。 k++; }***************
VB八皇后问题:在国际棋盘上(8*8)放置8皇后,要求每个皇后相互之间不在同列同行同斜线上,求可能情况
- 答案是(1,1)(2,5)(3,8)(4,6)(5,3)(6,7)(7,2)(8,4)我写的代码是Private Sub Command1_Click()Dim a%(1 To 8), i%, j%, flag%For i = 1 To 8 a(i) = 1Nexti = 2Do Select Case i Case i 1 Label1 = "无解" Exit Do Case i 8 For j = 1 To 8 Label1 = Label1 & a(j) Next Exit Do Case Else flag = 0 If i = 1 Then flag = 0 Else For j = 1 To i – 1 If a(j) = a(i) Or Abs(a(i) – a(j)) = i – j Then flag = 1: Exit For Next End If If flag = 1 And a(i) 8 Then a(i) = a(i) + 1 ElseIf flag = 0 Then i = i + 1 Else If a(i) = 8 And a(i – 1) = 8 Then a(i) = 1 a(i – 1) = 1 a(i – 2) = a(i – 2) + 1 i = i – 2 Else a(i) = 1 i = i – 1 a(i) = a(i) + 1 End If End If End SelectLoopEnd Sub一直通不过 我快疯了 折磨了好几天了 一直不知道问题在哪里 用断点检查也没找到问题所在 有没有高人指点一下啊
- %D%A%D%A八皇后问题:c语言%D%A|%D%A%D%A八皇后问题:算法%D%A|%D%A%D%A八皇后问题:pascal%D%A|%D%A%D%A八皇后问题:代码%D%A|%D%A%D%A八皇后问题:软件%D%A%D%A%D%A%D%A求八皇后问题C语言源代码!急!用C语言编写八皇后问题%D%A八皇后C语言程序及实验报告840%D%A其他答案%D%A代码如下28有问题hi我#include <stdio.h>enum boolean ;enum boolean a[9] , b[17] , c[17] ;//检查皇后之间是否冲突int s[9]; void main(){ int i=1,j=1; int cj=1; while(i<=8) { for(j=cj;j<=8;j++) if(!a[j] && !b[i+j] && !c[i-j+9]) break; if(j<=8) { s[i]=j; a[j]=TRUE; b[i+j]=TRUE; c[i-j+9]=TRUE; i++; cj=1; } else { i--; j=s[i]; a[j]=FALSE; b[i+j]=FALSE; c[i-j+9]=FALSE; cj=j+1; } } for(i=1;i<=8;i++) { for(j=1;j<=8;j++) { if(s[i]==j) printf("%d ",s[i]); else printf("- "); } printf("\n"); }}