- #include<stdio.h>
- int check(int (*matrix)[8]);
- void eight_queen(int (*matrix)[8],int n);
- static int number;
- void eight_queen(int (*matrix)[8],int n)
- {
- int i,j;
- if(n>7)
- {
- number++;
- printf("----------------------\n");
- for(i=0;i<8;i++)
- { for(j=0;j<8;j++)
- printf(" %d",matrix[i][j]);
- printf("\n");
- }
- }
- else
- {
- for(i=0;i<8;i++)
- {
- matrix[n][i]=1;
- if(check(matrix))
- {
- // printf("n and i is %d %d\n",n,i);
- eight_queen(matrix,n+1);
-
- }
- //else //一开始我在这个地方加了else 结果
- //怎么调都不对啊,还是好好看看算法伪代码
- matrix[n][i]=0;
- }
- }
- }
- int check(int (*matrix)[8])
- {
- int i,j;
- int a[8]={},b[8]={},c[15]={},d[15]={};
- for(i=0;i<8;i++)
- for(j=0;j<8;j++)
- { a[i]+=matrix[i][j];
- b[j]+=matrix[i][j];
- c[i-j+7]+=matrix[i][j];
- d[j+i]+=matrix[i][j];
- }
- for(i=0;i<8;i++)
- {
- if(a[i]>=2||b[i]>=2)
- return 0;
- }
- for(j=0;j<15;j++)
- if(c[j]>=2||d[j]>=2)
- return 0;
- return 1;
- }
- int main()
- {
- int matrix[8][8]={};
- eight_queen(matrix,0);
- printf("number is %d\n",number);
- return 0;
- }
一开始没有在网上看别人的代码,自己写的程序,结果总是不对
于是仔细研究网上的程序,最后找出来多加了一个else
回溯法在遍历本轮的每一个状态之后一定要清除状态,因为我用的是矩阵,直接修改矩阵的值
所以一定要清零,而数组类型的可以直接赋值覆盖掉上一个值,这样造成我思维不清楚(该吃脑残片了)
我对回溯法的理解就是,循环中先置位,判断是否正确,进入递归or not,清零,开始下一轮循环
阅读(907) | 评论(0) | 转发(0) |