递归后的 回溯流程是什么样子的?请详细说明

来源:百度知道 编辑:UC知道 时间:2024/06/04 04:36:23
void Queen(int n)
{
int i;

//!参数n从0开始,等于8时便试出了一个解,将它输出并回溯。
if(n == QUEENS)
{
Output();
return;
}

//!n还没到8,在第n列的各个行上依次试探。
for(i = 1 ; i <= QUEENS ; i++)
{
//!在该列的第i行上放置皇后。
Site[n] = i;

//!如果放置没有冲突,就开始下一列的试探。
if(IsValid(n))
Queen(n + 1);
}
}

针对8皇后的分析如下:
Queen(0)
i=1,n=0,Site[0]=1
..Queen(1)
..i=1,n=1,Site[1]=1,Error
..i=2,n=1,Site[1]=2,Error
..i=3,n=1,Site[1]=3
....Queen(2)
....i=1,n=2,Site[2]=1,Error
....i=2,n=2,Site[2]=2,Error
....i=3,n=2,Site[2]=3,Error
....i=4,n=2,Site[2]=4,Error
....i=5,n=2,Site[2]=5
......Queen(3)
......i=1,n=3,Site[3]=1,Error
......i=2,n=3,Site[3]=2
........Queen(4)
........i=1,n=4,Site[4]=1,Error
........i=2,n=4,Site[4]=2,Error
........i=3,n=4,Site[4]=3,Error
........i=4,n=4,Site[4]=4
..........Queen(5)
..........i=1,n=5,Site[5]=1,Error
..........i=2,n=5,Site[5]=2,Error
..........i=3,n=5,Site[5]=3,Error
..........i=4,n=5,Site[5]=4,Error
..........i=5,n=5,Site[5]=5,Error
..........i=6,n=5,Site[5]=6,Error
..........i=7,n=5,Site[5]=7,Error
..........i=8,n=5,Site[5]=8,Error
..........Queen(5) return <<<<****>>>>
........i=5