山西太平柜销售:关于扑克牌的一个算法题,有人会吗?

来源:百度文库 编辑:神马品牌网 时间:2024/05/04 07:41:00
如下:

原有N套扑克牌,因天长日久均已张数不全。现把它们合在一起,看是否能凑成M(M<N)套完整的扑克牌(不用考虑大小王)。

输入(请使用标准输入、输入,不要读写文件)
输入数据的第一行是一个数字N,(1≤N≤20),表示原有N付牌。从第二行起,每4行用于描述一付牌的不同花色(固定为黑红草方的顺序)的现有张数(各行的第一位数)和牌号I(1≤I≤13)(各行的其余的数字,无序)。

输出(请使用标准输入、输入,不要读写文件)
输出只有一行,即为你所能拼凑的扑克牌套数。

这个问题其实就是求张数最少的牌号的问题。
不知道楼主用什么语言来写

我的思路是这样的:
定议一个二维数组如:a(4,13) 来保存张数。
然后对所有牌号进行统计,至于如何统计,可以将第一行去掉,把每行第一个数去掉,然后把相同花色的数字合并字符串。再把字符串转为数组,这样就可以统计了。

统计后求最小,即解决问题

方法可能很笨,但也能实现目的

我想的算法[类C伪代码],不足之处请高手指出,谢谢:
int cards[5][14]={0},input[14];
scanf(N);
if(N>20||N<0)
{printf(input error);exit();}
for(n=1;n<=N;n++)
{
for(i=1;i<=4;i++)
{
scanf(input);
for(j=1;j<=input[0];j++)
{
cards[i][input[j]]++;
}}}
for(i=1;i<=4;i++)
for(j=1;j<=13;j++)
if(min>cards[i][j])min=cards[i][j];

printf(min);