猜牌游戏
【问题描述】
猜牌游戏:桌上有分别写着1-100的100张牌,游戏者从100张牌子中抽出K张,把K(1<K<100)张牌对应的数字相乘得到一个结果S,然后把结果S告诉挑战者,让挑战者猜游戏者K张牌的可能组合。游戏者也可能报一个假的结果S给挑战者,也就是不存在K张牌相乘得到该结果,这时挑战者要辨别游戏者是否说谎。挑战者猜中则为赢,猜错就为输。
【输入形式】
从标准输入自然数S和自然数K。
【输出形式】
输出K张牌的所有方式(用空格隔开),每一种方式为一行,在每一行末均输出一个回车符。如果不存在K张牌相乘得到S的情况,则输出LIE。
【输入样例】
100 3
100 5
23205 3
【输出样例】
1 2 50
1 4 25
1 5 20
2 5 10
LIE
3 85 91
5 51 91
7 39 85
7 51 65
13 21 85
13 35 51
15 17 91
17 21 65
17 35 39
该题与Crashing Balloon相似,但较为简单,思路及代码如下:
#include<stdio.h>
//n 已找到的因子数, q 当前因子, a 已找到的因子, num 情况数
void Solve(int s, int k, int n, int q, int a[], int &num){
if(q > 100){ //若因子超出100,则结束
return;
}
if(n > k){ //若因子数量足够
if(s == 1){ //若s完全除尽
for(int i = 1; i <= k; ++i){ //输出所有因子
printf("%d ", a[i]);
}
printf("\n");
++num;
}
return;
}
if(s % q == 0){ //若q是s的因子
a[n] = q; //存入数组
Solve(s / q, k, n + 1, q + 1, a, num); //下层递归
}
Solve(s, k, n, q + 1, a, num); //寻找下一个因子
}
int main(){
int s, k;
while(~scanf("%d%d", &s, &k)){
int num = 0, a[100] = {0};
Solve(s, k, 1, 1, a, num);
if(!num) //若情况总数为0
printf("LIE\n"); //说明没找到
}
return 0;
}
=======================签 名 档=======================
原文地址(我的博客):http://www.clanfei.com/2012/06/1325.html
欢迎访问交流,至于我为什么要多弄一个博客,因为我热爱前端,热爱网页,我更希望有一个更加自由、真正属于我自己的小站,或许并不是那么有名气,但至少能够让我为了它而加倍努力。。
=======================签 名 档=======================