硬币问题与八皇后问题

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值