穷举法:在某个范围内将所有情况进行验证,若某个情况符合条件则为一个解。
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();
}*/