1.硬币问题
问题描述:一个陌生的国度,有5种不同的硬币单位:15、23、29、41和67(分)。
寻找所有组成18元8分(即1808分)的可能组合。
假定对于所有面值的硬币你都有足够的硬币。
解决思路:利用for循环的嵌套来实现,若不能恰巧凑够1808则跳出循环,直到凑够1808分,即可列出所有情况
实现方法:
int Money()
{
int count = 0;
for(int m1=0;m1<=1808/15;m1++)//15
{
for(int m2=0;m2<=1808/23;m2++)//23
{
if(m1*15+m2*23 > 1808)
continue;
for(int m3=0;m3<1808/29;m3++)//29
{
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 )
continue;
else if(m1*15+m2*23+m3*29+m4*41+m5*67 == 1808 )
{
count++;
printf("%d,%d,%d,%d,%d\n",m1,m2,m3,m4,m5);
}
}
}
}
}
}
return count;
}
2.八皇后问题
问题描述:在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子。将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?
解决思路:利用上题思路,可用for循环来实现,直到最后,列出所有情况
实现方法:
int Queen()
{
int count = 0;
for(int q1=0;q1<8;q1++)
{
for(int q2=0;q2<8;q2++)
{
if(q2==q1 || q2+1==q1 ||q2-1==q1)
continue;
for(int q3=0;q3<8;q3++)
{
if(q3==q1 || q3+2==q1 || q3-2==q1 ||
q3==q2 || q3+1==q2 || q3-1==q2)
continue;
for(int q4=0;q4<8;q4++)
{
if(q4==q1 || q4+3==q1 || q4-3==q1 ||
q4==q2 || q4+2==q2 || q4-2==q2 ||
q4==q3 || q4+1==q3 || q4-1==q3)
continue;
for(int q5=0;q5<8;q5++)
{
if(q5==q1 || q5+4==q1 || q5-4==q1 ||
q5==q2 || q5+3==q2 || q5-3==q2 ||
q5==q3 || q5+2==q3 || q5-2==q3 ||
q5==q4 || q5+1==q4 || q5-1==q4)
continue;
for(int q6=0;q6<8;q6++)
{
if(q6==q1 || q6+5==q1 || q6-5==q1 ||
q6==q2 || q6+4==q2 || q6-4==q2 ||
q6==q3 || q6+3==q3 || q6-3==q3 ||
q6==q4 || q6+2==q4 || q6-2==q4 ||
q6==q5 || q6+1==q5 || q6-1==q5)
continue;
for(int q7=0;q7<8;q7++)
{
if(q7==q1 || q7+6==q1 || q7-6==q1 ||
q7==q2 || q7+5==q2 || q7-5==q2 ||
q7==q3 || q7+4==q3 || q7-4==q3 ||
q7==q4 || q7+3==q4 || q7-3==q4 ||
q7==q5 || q7+2==q5 || q7-2==q5 ||
q7==q6 || q7+1==q6 || q7-1==q6)
continue;
for(int q8=0;q8<8;q8++)
{
if(q8==q1 || q8+7==q1 || q8-7==q1 ||
q8==q2 || q8+6==q2 || q8-6==q2 ||
q8==q3 || q8+5==q3 || q8-5==q3 ||
q8==q4 || q8+4==q4 || q8-4==q4 ||
q8==q5 || q8+3==q5 || q8-3==q5 ||
q8==q6 || q8+2==q6 || q8-2==q6 ||
q8==q7 || q8+1==q7 || q8-1==q7 )
continue;
count++;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",
q1,q2,q3,q4,q5,q6,q7,q8);
}
}
}
}
}
}
}
}
return count;
}