从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生。哈哈
开个玩笑~~~~
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
具体算法:
#include "stdafx.h" #include <stdlib.h> #define N 8 typedef struct _tag_Pos { int ios; int jos; } Pos; static char board[N+2][N+2]; static Pos pos[] = { {-1, -1}, {-1, 0}, {-1, 1} }; static int count = 0; void init() { int i = 0; int j = 0; for(i=0; i<N+2; i++) { board[0][i] = '#'; board[N+1][i] = '#'; board[i][0] = '#'; board[i][N+1] = '#'; } for(i=1; i<=N; i++) { for(j=1; j<=N; j++) { board[i][j] = ' '; } } } void display() { int i = 0; int j = 1; for(i=0; i<N+2; i++) { for(j=0; j<N+2; j++) { printf("%c", board[i][j]); } printf("\n"); } } int check(int i, int j) { int ret = 1; int p = 0; for(p=0; p<3; p++)//在三个方向寻找 { int ni = i; int nj = j; while( ret && (board[ni][nj] != '#') ) { ni = ni + pos[p].ios; nj = nj + pos[p].jos; ret = ret && (board[ni][nj] != '*'); } } return ret; } void find(int i) { int j = 0; if( i > N ) { count++; printf("Solution: %d\n", count); display(); getchar(); } else { for(j=1; j<=N; j++) { if( check(i, j) ) { board[i][j] = '*'; find(i+1); board[i][j] = ' '; } } } } int main() { init(); find(1); system("pause"); return 0; }
结果:八皇后共有92中解法,这里就不一一的列出来了。
具体看自己的运行结果吧~~~~~
递归之回朔算法应用----八皇后问题
时间: 2024-10-12 12:41:20