八皇后问题

来源:互联网 发布:网络诈骗主题班会记录 编辑:程序博客网 时间:2024/05/22 15:50

算法思路:
        1.初始化:  i=1
         2.初始化: j=1
         3.从第一行开始,恢复j的当前值,判断低j个位置
               a.位置j可放入皇后,标记位置(i,j),i++,转步骤2
               b.位置j不可放入皇后,j++,转步骤a
               c.当j>8时,i--,转步骤3
         4.结束:
               第8行有位置可放入皇后

#include<stdio.h>#define N 8/*模拟棋盘,加2为了判定边界*/static char board[N + 2][N + 2];static int count = 0;/*定义的偏移量*/typedef struct _tag_pos{int  ios;int  jos;}Pos;static Pos pos[] = { {-1,-1},{-1,0},{-1,1}};void display(){int i = 0;int j = 0;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("Soulution %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] = ' ';}}}}/*初始化化棋盘*/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] = ' ';}}  }int main(){init();find(1);return 0;}

0 0
原创粉丝点击