八皇后问题
View Code
我写这个代码的原因是因为,八皇后问题是一个非常经典的递归问题,自己又掌握的不是很熟练,为了防止忘记,可以随时拿出来看一看,加深理解 #include<stdio.h> int num; // 统计方案数目 int q[9]; // 记录每行皇后所在的列号 int c[9]; // 标记当前列是否安全,值取0(不安全)或1(安全) int l[17]; // 标记左上到右下的对角线是否安全,值取0(不安全)或1(安全) int r[17]; // 标记坐下到右上的对角线是否安全,值取0(不安全)或1(安全) void queen(int i) { int j,k; for(j = 1;j <= 8; ++j) { if(c[j] && l[i-j+9] && r[i+j]) // (i,j)所在的位置是安全的 { q[i] = j; // 存储当前皇后的列位置 c[j] = 0; l[i-j+9] = 0; r[i+j] = 0; // 修改(i,j)位置的三个安全标记 if(i < 8) queen(i+1); // 未放完8个皇后的,继续放下一个 else // 已放完皇后的,执行如下操作 { num++; // 方案计数加1 printf("方案%2d: ",num); // 输出方案数 for(k = 1;k <= 8; k++) printf("%d ",q[k]); // 输出 printf("\n"); } c[j] = 1; l[i-j+9] = 1; r[i+j] = 1; } } } int main() { int i; num = 0; for(i = 0;i < 9; ++i) c[i] = 1; for(i = 0;i < 17; i++) l[i] = r[i] = 1; queen(1); return 0; }