Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431605
  • 博文数量: 103
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-15 22:17
文章分类

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: C/C++

2012-10-07 22:35:34


 

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. int check(int (*matrix)[8]);
  3. void eight_queen(int (*matrix)[8],int n);
  4. static int number;

  5. void eight_queen(int (*matrix)[8],int n)
  6. {
  7.  int i,j;
  8.  if(n>7)
  9.  {
  10.  number++;
  11.  printf("----------------------\n");
  12.  for(i=0;i<8;i++)
  13.   { for(j=0;j<8;j++)
  14.     printf(" %d",matrix[i][j]);
  15.    printf("\n");
  16.   }
  17.  }
  18.  else
  19.  {
  20.   for(i=0;i<8;i++)
  21.   {
  22.    matrix[n][i]=1;
  23.    if(check(matrix))
  24.    {
  25. // printf("n and i is %d %d\n",n,i);
  26.     eight_queen(matrix,n+1);
  27.     
  28.    }
  29. //else //一开始我在这个地方加了else 结果
  30. //怎么调都不对啊,还是好好看看算法伪代码
  31.    matrix[n][i]=0;
  32.   }
  33.  }
  34. }
  35. int check(int (*matrix)[8])
  36. {
  37.  int i,j;
  38.  int a[8]={},b[8]={},c[15]={},d[15]={};
  39.  for(i=0;i<8;i++)
  40.   for(j=0;j<8;j++)
  41.   { a[i]+=matrix[i][j];
  42.    b[j]+=matrix[i][j];
  43.    c[i-j+7]+=matrix[i][j];
  44.    d[j+i]+=matrix[i][j];
  45.   }
  46.  for(i=0;i<8;i++)
  47.  {
  48.  if(a[i]>=2||b[i]>=2)
  49.   return 0;
  50.  }
  51.  for(j=0;j<15;j++)
  52.  if(c[j]>=2||d[j]>=2)
  53.   return 0;
  54.  return 1;
  55. }
  56. int main()
  57. {
  58.  int matrix[8][8]={};
  59.  eight_queen(matrix,0);
  60.  printf("number is %d\n",number);
  61.  return 0;
  62. }

一开始没有在网上看别人的代码,自己写的程序,结果总是不对

于是仔细研究网上的程序,最后找出来多加了一个else

回溯法在遍历本轮的每一个状态之后一定要清除状态,因为我用的是矩阵,直接修改矩阵的值

所以一定要清零,而数组类型的可以直接赋值覆盖掉上一个值,这样造成我思维不清楚(该吃脑残片了)

我对回溯法的理解就是,循环中先置位,判断是否正确,进入递归or not,清零,开始下一轮循环

阅读(904) | 评论(0) | 转发(0) |
0

上一篇:注释转载代码

下一篇:软连接和硬链接

给主人留下些什么吧!~~