【题目】回溯-八皇后问题 2024-10-16 21:11 | 编途|C++ 本文最后更新于 32 天前,其中的信息可能已经有所发展或是发生改变。 题目链接 Luogu 题目描述 一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列 2 4 6 1 3 52 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下:行号 1 2 3 4 5 61 2 3 4 5 6列号 2 4 6 1 3 52 4 6 1 3 5这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。请输出前 33 个解。最后一行是解的总个数。 代码演示 #include<iostream> using namespace std; int hang[100],lie[100],duijiao1[100],duijiao2[100];; int N,sum=0; void print() { if(sum <= 2){ for(int i = 1; i <= N; i++){ cout << hang[i] <<" "; } cout << endl; } sum++; } void queen(int i) { if(i > N){ print(); return; } else{ for(int j = 1; j <= N; j++){ if((!lie[j]) &&(!duijiao1[i+j]) &&(!duijiao2[i-j+N])){ hang[i] = j; lie[j] = 1; duijiao1[i+j] = 1; duijiao2[i-j+N] = 1; queen(i+1); lie[j] = 0; duijiao1[i+j] = 0; duijiao2[i-j+N] = 0; } } } } int main() { cin >> N; queen(1); cout<<sum << endl; return 0; } 主要分析主体queen函数的回溯部分1.i>N 意味着棋盘已经放满棋子;2.而后else下面是记录j如hang中,lie duijiao12 是占位用的;注意:关于回溯部分:1.return函数返回上一个召唤的函数2.同时,也有当召唤的函数运行完了也会回到上一个召唤的函数。