美文网首页
八皇后问题

八皇后问题

作者: LuckTime | 来源:发表于2016-06-18 09:54 被阅读26次

include<cstdio>

include<stdio.h>

int queenPlaces[92][8];
int count = 0;
int board[8][8];
int putQueen(int ithQueen);

int ab(int n)
{
return n > 0 ? n : -n;
}

int main(){
int n, i, j;
for(i = 0; i < 8; i++)
{
for(j = 0; j < 8; j++)
board[i][j] = -1;
for(j = 0; j < 92; ++j) //一共九十二种算法
queenPlaces[j][i] = 0; //棋盘的初始化
}
putQueen(0);
scanf("%d",&n);
for(i = 0; i < n; ++i)
{
int ith;
scanf("%d",&ith);
for(j = 0;j < 8; ++j)
printf("%d",queenPlaces[ith-1][j]);
printf("\n");
}

return 0;
}

int putQueen(int ithQueen) //找到一组解,退出函数
{
int i, k, r;
if(ithQueen == 8)
{
count++;
return 0;
}
for( i =0;i < 8; i++){

if(board[i][ithQueen] == -1){
board[i][ithQueen] = ithQueen; //找到-1 可以摆皇后
for(k = count; k < 92; k++)
{
queenPlaces[k][ithQueen] = i + 1;
}
for( k = 0; k < 8; ++k)
for( r = 0; r < 8; r++) //当board[k][r] == -1 行列斜的时候 ,
if(board[k][r] == -1 &&(k ==i||r==ithQueen||ab(k-i)==ab(r-ithQueen)))
board[k][r] = ithQueen;

putQueen(ithQueen + 1); //递归

//back trace
for(k = 0; k < 8; ++k) //回溯算法体现
for(r = 0; r < 8; r++)
if(board[k][r] == ithQueen)
board[k][r] = -1;
}
}

}

相关文章

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

  • 八皇后问题

    问题描述: 在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。 cl...

网友评论

      本文标题:八皇后问题

      本文链接:https://www.haomeiwen.com/subject/kznvdttx.html