回溯思想:先按一条路径逐一枚举,当发现不是正确街时就退回去选择其他路径。
回溯步骤:1、定义问题的解空间
2、确定易于搜索的解空间结构
3、以深度优先方式搜索解空间,并在搜索过程中去除无效搜索
例如:八皇后
在8*8格的国际象棋盘上摆放8个皇后,使其不能相互攻击,即任意2个皇后不能在同一行同一列同一斜线上,问有多少种摆法
void print()//输出每一种情况下棋盘中皇后的摆放情况
{
int outer;
int inner;
for(outer=0;outer<8;outer++)
{
for(inner=0;inner<gEightQueen[outer];inner++)
cout<<"_";
printf("*");
for(inner=gEightQueen[outer]+1;inner<8;inner++)
cout<<"_";
cout<<endl;
}
cout<<"==========================\n";
}
int check_pos_valid(int loop , int value)
{
int index;
int data;
for(index = 0 ; index < loop ; index++)
{
data = gEightQueen[index];
if(value == data)
return 0;
if((index + data) == (loop + value))
return 0;
if((index - data) == (loop - value))
return 0;
}
return 1;
}
void eight_queen(int index)
{
int loop;
for(loop=0;loop<8;loop++)
{
if(check_pos_valid(index,loop))
{
gEightQueen[index]=loop;
if(7==index)
{
gCount++;
print();
gEightQueen[index]=0;
return;
}
eight_queen(index+1);
gEightQueen[index]=0;
}
}
}