一、回溯法是什么?
基本思想:再包含问题的解空间树中,按照深度优点的策略,从根节点出发深度搜索解空间树,如果包含,就从包含,就从该节点出发继续搜索下去:如果该节点不包含问题的解,就说明以该节点为根节点的子树一定不包含问题的解,那就说明以该节点为根节点的子树一定不包含问题的最终解,因此要跳过对以该节点为根的子树的系统搜索逐层向子树的祖先节点回溯。
二、四皇后问题
1.四皇后问题
问题描述:在N*N的棋盘上,如何无冲突的拜访N个皇后棋子。注意:棋子移动的规则是该棋子所在行、列、45度方向的棋盘格子中不能出现其他皇后棋子,求N个皇后棋子的摆放规则。
问题分析:以四皇后为例子,在4 *4 的格子中放置4枚棋子,要求4枚棋子所出现的棋子的行、列、45度方向上不能有其他棋子的出现,下图所所展示的就就是四皇后其中的一种摆放规则。
2.图解
按照规则往下寻找,如果满足条件则继续往下寻找,如果不满足条件,返回上一下,该节点不会继续往下进行。
其中最下面的第三个是满足条件的
代码如下(示例):
3.代码展示
#include <stdio.h>
int count = 0;
int is_correct(int i, int j, int (*Q)[4])
{
int n,m = 0;
for(m=0,n=i;m<4;++m)
{
if(Q[n][m] == 1 && m !=j)
{
return 0;
}
}
for(m=j,n=0;n<4;++n)
{
if(Q[n][m] == 1 && n !=i)
{
return 0;
}
}
for(n=i-1,m=j-1;m>=0 && n>=0;n--,m--)
{
if(Q[n][m] == 1)
{
return 0;
}
}
for(n=i+1,m=j-1;m>=0 && n<4;n++,m--)
{
if(Q[n][m] == 1)
{
return 0;
}
}
for(n=i-1,m=j+1;m<4 && n>=0;n--,m++)
{
if(Q[n][m] == 1)
{
return 0;
}
}
for(n=i+1,m=j+1;m<4 && n<4;n++,m++)
{
if(Q[n][m] == 1)
{
return 0;
}
}
return 1;
}
void Queen(int j, int (*Q)[4])
{
int i = 0;
int k = 0;
if(j == 4)
{
for(i = 0;i < 4;i++)
{
for(j=0;j< 4;j++)
{
printf("%d ",Q[i][j]);
}
printf("\n");
}
printf("\n");
count++;
return ;
}
for(i = 0;i < 4;++i )
{
if(is_correct(i,j,Q))
{
Q[i][j] = 1;
Queen(j+1,Q);
Q[i][j] = 0;
}
}
}
int main(int argc, const char *argv[])
{
int Q[4][4];
int i,j=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
Q[i][j]=0;
}
}
Queen(0,Q);
printf("The number of the answers if FOUR_QUEEN are %d \n",count);
return 0;
}
4.结果
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。