回溯法解决八皇后问题
2014-04-14 13:57
351 查看
#include <stdio.h>
#include <string.h>
//--------------回溯法解决八皇后问题P151----------//
//首先判断棋盘上是否已经得到一个完整的布局(即棋盘上是否已经摆放了8个棋子),若是,则输出该布局;
//否则,一次先根遍历满足约束条件的各个子树。
int total; //不能声明为static,不然对于其他的文件不可见
void Trial(int i, int n , int (* A )[8])
{
total++;
if (i > n)
{
static int num; //记录符合要求的个数
num++;
printf( "%d\n" ,num);
for (int j=0;j<= n;j++)
{
for (int k=0;k<= n;k++)
printf( "%d" ,A [j][k]);
putchar( '\n' );
}
//memset(A,0,sizeof(A));//无需在这里清零
//putchar('\n');
}
else
for (int j=0;j<= n;j++)
{
int temp=true ;
for (int p=j;p>=0;p--)
if (A [ i][p]==1)
temp= false ;
for (int p= i;p>=0;p--)
if (A [p][j]==1)
temp= false ;
for (int p=j,k= i;
p>=0 && k>=0; p--,k--)
if (A [k][p]==1)
temp= false ;
for (int p=j,k= i;
p<= n && k>=0; p++,k--)
if (A [k][p]==1)
temp= false ;
if (temp)//合法则遍历
{
A [i ][j]=1; //如果合理,在这个位置放置一个棋子
Trial( i +1,n , A);
A [i ][j]=0; //这里就体现了回溯
}
}
}
main.cpp:
[align=left]
[/align]
[align=left] //--------------TEST回溯法解决八皇后问题P151----------//[/align]
[align=left] int A[8][8];[/align]
[align=left]
[/align]
[align=left] memset(A,0, sizeof (A));[/align]
[align=left] freopen( "f:\dataout.txt" , "w", stdout );[/align]
[align=left] Trial(0,7,A);[/align]
//extern int
total;
//static int
total;
[align=left] printf( "%d\n" ,total);//记录总共那个递归次数[/align]
#include <string.h>
//--------------回溯法解决八皇后问题P151----------//
//首先判断棋盘上是否已经得到一个完整的布局(即棋盘上是否已经摆放了8个棋子),若是,则输出该布局;
//否则,一次先根遍历满足约束条件的各个子树。
int total; //不能声明为static,不然对于其他的文件不可见
void Trial(int i, int n , int (* A )[8])
{
total++;
if (i > n)
{
static int num; //记录符合要求的个数
num++;
printf( "%d\n" ,num);
for (int j=0;j<= n;j++)
{
for (int k=0;k<= n;k++)
printf( "%d" ,A [j][k]);
putchar( '\n' );
}
//memset(A,0,sizeof(A));//无需在这里清零
//putchar('\n');
}
else
for (int j=0;j<= n;j++)
{
int temp=true ;
for (int p=j;p>=0;p--)
if (A [ i][p]==1)
temp= false ;
for (int p= i;p>=0;p--)
if (A [p][j]==1)
temp= false ;
for (int p=j,k= i;
p>=0 && k>=0; p--,k--)
if (A [k][p]==1)
temp= false ;
for (int p=j,k= i;
p<= n && k>=0; p++,k--)
if (A [k][p]==1)
temp= false ;
if (temp)//合法则遍历
{
A [i ][j]=1; //如果合理,在这个位置放置一个棋子
Trial( i +1,n , A);
A [i ][j]=0; //这里就体现了回溯
}
}
}
main.cpp:
[align=left]
[/align]
[align=left] //--------------TEST回溯法解决八皇后问题P151----------//[/align]
[align=left] int A[8][8];[/align]
[align=left]
[/align]
[align=left] memset(A,0, sizeof (A));[/align]
[align=left] freopen( "f:\dataout.txt" , "w", stdout );[/align]
[align=left] Trial(0,7,A);[/align]
//extern int
total;
//static int
total;
[align=left] printf( "%d\n" ,total);//记录总共那个递归次数[/align]
相关文章推荐
- 回溯法解决八皇后问题
- 第一次上传代码 处女秀-回溯法解决八皇后问题
- scala 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- 八皇后问题解决及代码下载(回溯法)
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- C++基于回溯法解决八皇后问题示例
- 数据结构41:回溯法解决八皇后问题
- C语言八皇后问题解决方法示例【暴力法与回溯法】
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题---用Java语言
- 回溯法解决八皇后问题--精简版
- 回溯法解决八皇后问题
- 回溯法解决“八皇后”问题
- 用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)
- 回溯法-八皇后问题
- php回溯法解决0-1背包问题
- Python使用回溯法子集树模板解决爬楼梯问题示例
- 回溯法解决N皇后问题(java实现)