八皇后问题(DFS剪枝)

来源:互联网 发布:linux强制改语言 编辑:程序博客网 时间:2024/05/16 12:29

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int count=0;
int c[10],chess[10][10];
void dfs(int depth)
{
 if (depth==9)
 {
  for(int i=1;i<=8;i++)
  {
   for(int k=1;k<=8;k++)
   {
    printf("%d ",chess[i][k]);
   }
   printf("\n");
  }
  count++;
  printf("\n");
  return ;
 }
 for(int i=1;i<=8;i++)
 {
  int ok=1;
  c[depth]=i;
  for(int k=1;k<depth;k++)
  {
   if (c[depth]==c[k]||c[depth]-c[k]==depth-k||c[depth]-c[k]==k-depth)
   {
    ok=0;
    break;
   }
  }
  if (ok)
  {
   chess[depth][i]=1;
   dfs(depth+1);
   chess[depth][i]=0;
  }
 }
 return ;
}
int main(int argc, char *argv[])
{
 memset(chess,0,sizeof(chess));
 dfs(1);
 printf("%d",count);
 return 0;
}


  几个要点:

1.棋子不能是(1,1) (1,2) 的放,根据每行必定会放一个来剪枝。

2.注意能放的条件判断。判断对角线通过行列之差是一个知识点。

0 0
原创粉丝点击