穷举法:在某个范围内将所有情况进行验证,若某个情况符合条件则为一个解。
int Queen()//八皇后问题{ int count = 0; for(int k1=0;k1<8;k1++) { for(int k2=0;k2<8;k2++) { if(abs(k2-k1) == 1 || k2 == k1 ) { continue; } for(int k3=0;k3<8;k3++) { if( abs(k3-k1) == 2 || abs(k3-k2) == 1 || k3 == k1 || k3 == k2)//abs对某个数取绝对值 { continue; } for(int k4=0;k4<8;k4++) { if( abs(k4-k1) == 3|| abs(k4-k2) == 2|| abs(k4-k3) == 1|| k4 == k1 || k4 == k2 || k4 == k3 ) { continue; } for(int k5=0;k5<8;k5++) { if( abs(k5-k1) == 4|| abs(k5-k2) == 3|| abs(k5-k3) == 2|| abs(k5-k4) == 1|| k5 == k1 || k5 == k2 || k5 == k3 || k5 == k4 ) { continue; } for(int k6=0;k6<8;k6++) { if( abs(k6-k1) == 5 || abs(k6-k2) == 4 || abs(k6-k3) == 3 || abs(k6-k4) == 2 || abs(k6-k5) == 1 || k6 == k1 || k6 == k2|| k6 == k3 || k6 == k4|| k6 == k5 ) { continue; } for(int k7=0;k7<8;k7++) { if( abs(k7-k1) == 6|| abs(k7-k2) == 5|| abs(k7-k3) == 4|| abs(k7-k4) == 3|| abs(k7-k5) == 2|| abs(k7-k6) == 1|| k7 == k1 || k7 == k2|| k7 == k3 || k7 == k4|| k7 == k5 || k7 == k6) { continue; } for(int k8=0;k8<8;k8++) { if( abs(k8-k1) == 7|| abs(k8-k2) == 6|| abs(k8-k3) == 5|| abs(k8-k4) == 4|| abs(k8-k5) == 3|| abs(k8-k6) == 2|| abs(k8-k7) == 1|| k8 == k1 || k8 == k2|| k8 == k3 || k8 == k4|| k8 == k5 || k8 == k6|| k8 == k7 ) { continue; } count++; printf("k1=%d,k2=%d,k3=%d,k4=%d,k5=%d,k6=%d,k7=%d,k8=%d\n", k1,k2,k3,k4,k5,k6,k7,k8); }
} } } } } } } return count; }
int main() { printf("%d\n",Queen()); }
/*int Money()//15分,23分,29分,41分,67分的硬币都有足够多,则凑成1808分有多少种情况。{ int count = 0; for(int m1 = 0;m1<1808/15;m1++) { for(int m2=0;m2<1808/23;m2++) { if(m1*15+m2*23>1808)//将已经不符合情况的筛选出去。 { continue;//结束本趟循环直接进入下一趟。 break:跳出一层循环。 } for(int m3=0;m3<1808/29;m3++) { if(m1*15+m2*23 + m3*29>1808) { continue; } for(int m4=0;m4<1808/41;m4++) { if(m1*15+m2*23 + m3*29 + m4*41>1808) { continue; } for(int m5=0;m5<1808/67;m5++) { if(m1*15+m2*23 + m3*29 + m4*41 + m5*67 == 1808) { count++; printf("15:%d,23:%d,29:%d,41:%d,67:%d\n",m1,m2,m3,m4,m5); } } } } } } return count;}
int main(){ printf("%d\n",Money());}*/
/*void Competition()//乒乓球比赛问题。a不和x打,c不和x,z打,找出三对赛手名单。 { char i ,j ,k; for(i = 'Y';i<='Z';i++) { for(j = 'X';j<='Z';j++) { if(i == j ) { continue; } for(k = 'X';k<='Z';k++) { if(k == 'X' || k == 'Z' || k == j || k == i) { continue; } printf("A-%c,B-%c,C-%c\n",i,j,k); } } } }
int main() { Competition(); }*/
转载于:https://www.cnblogs.com/97-5-1/p/7372261.html
相关资源:数据结构—成绩单生成器