回朔法(可称通用解题法)
例子:N皇后问题
描述:N*N棋盘上无冲突的摆放N个皇后棋子,在国际象棋里皇后移动方式为横竖交叉的,求有几种解法
思路:解空间树,从根节点出发,深度搜索整个树
附上解四皇后问题的代码
#include<stdio.h>
int count = 0;
int isCorrect(int i, int j, int(*Q)[4])
{
int s, t;
for(s =i,t= 0;t<4;t++)
if(Q[s][t] == 1 && t!=j) return 0; //判断行
for(t =j,s= 0;s<4;s++)
if(Q[s][t] == 1 && s!=i) return 0; //判断列
for(s =i-1,t= j-1; s>=0 && t>=0; s--,t--)
if(Q[s][t] == 1) return 0; //判断左上方
for(s =i+1,t= j+1; s<4 && t<4; s++,t++)
if(Q[s][t] == 1) return 0; //判断右下方
for(s =i-1,t= j+1; s>=0 && t<4; s--,t++)
if(Q[s][t] == 1) return 0; //判断右上方
for(s =i+1,t= j-1; s<4 && t>=0; s++,t--)
if(Q[s][t] == 1) return 0; //判断左下方
return 1; //否则返回1
}
void Queen(int j, int (*Q)[4])
{
int i, k;
if(j==4)
{
for(i=0; i<4; i++)
{
for(k=0; k<4; k++)
{
printf("%d ", Q[i][k]);
}
printf("\n");
}
printf("\n");
//getche();
count++;
return;
}
for(i=0; i<4; i++)
{
if(isCorrect(i,j,Q))
{
Q[i][j] = 1;
Queen(j+1,Q);
Q[i][j] = 0;
}
}
}
int main()
{
int Q[4][4];
int i,j;
for(i=0; i<4; i++){
for(j=0; j<4; j++)
{
Q[i][j]=0;
}
}
Queen(0,Q);
printf("皇后问题解的个数为%d",count);
return 0;
}