Hidden Number

Hidden Number

时间: 1ms        内存:32M

描述:

Your job is to find out the secret number hidden in a matrix, each of whose element is a digit ('0'-'9') or a letter ('A'-'Z'). You can see an example matrix in Figure 1. 

 

The hidden number and other non-secret ones are coded in a matrix as sequences of digits in a decimal format. You should only consider sequences of digits D1 D2 ... Dn such that Dk+1 (1 <= k < n) is either right next to or immediately below Dk in the matrix. The secret you are seeking is the largest number coded in this manner.
Four coded numbers in the matrix in Figure 1, i.e., 908820, 23140037, 23900037, and 9930, are depicted in Figure 2. As you may see, in general, two or more coded numbers may share a common subsequence. In this case, the secret number is 23900037, which is the largest among the set of all coded numbers in the matrix. 
In contrast, the sequences illustrated in Figure 3 should be excluded: 908A2 includes a letter; the fifth digit of 23149930 is above the fourth; the third digit of 90037 is below right of the second.
Write a program to figure out the secret number from a given matrix.

输入:

The input consists of multiple data sets, each data set representing a matrix. The format of each data
set is as follows.
W H
C11C12 ... C1W
C21C22 ... C2W
...
CH1CH2 ... CHW
In the first line of a data set, two positive integers W and H are given. W indicates the width (the number
of columns) of the matrix, and H indicates the height (the number of rows) of the matrix. W+H is less
than or equal to 70.
H lines follow the first line, each of which corresponds to a row of the matrix in top to bottom order. The
i-th row consists of W characters Ci1Ci2 ... CiW in left to right order. You may assume that the matrix
includes at least one non-zero digit.
Following the last data set, two zeros in a line indicate the end of the input.

输出:

For each data set, print the hidden number on a line. Leading zeros should be suppressed.

示例输入:

7 4
9R2A993
0E314A0
8A900DE
820R037
6 7
JH03HE
ID7722
0DA1AH
30C9G5
99971A
CA7EAI
AHLBEM
20 2
A1234567891234CBDEGH
BDEDF908034265091499
0 0

示例输出:

23900037
771971
12345908034265091499

提示:

参考答案(内存最优[752]):

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a,const void *b)
{
	return *(int *)a - *(int *)b;
}

int main()
{
	int n,m,shu,sum = 0,zheng[10],fu[10],i = 0,j = 0,zflag = 0,fflag = 0,k,zero = 0;
	scanf("%d",&n);
	while(n--)
	{
	    scanf("%d",&m);
	    while(m--)
		{
			scanf("%d",&shu);
			if(shu > 0)
			{
				zheng[i++] = shu;
				zflag = 1;
			}
			if(shu < 0)
			{
				fu[j++] = shu;
				fflag = 1;
			}
			if(shu == 0)
			zero = 1;
		}
		if(zflag)
		qsort(zheng,i,sizeof(int),cmp);
		if(fflag)
		qsort(fu,j,sizeof(int),cmp);
		if(zflag)
		{
			for(k = 0;k < i;k++)
			sum += zheng[k];
			if(fflag)
			{
                if((sum - zheng[0]) > (sum + fu[j-1]))
				printf("%d\n",sum - zheng[0]);
				else
				printf("%d\n",sum + fu[j-1]);
			}
			else
			printf("%d\n",sum - zheng[0]);
		}
		else
		{
			if(zero)
			printf("%d\n",fu[j-1] + 0);
			else
			printf("%d\n",fu[j-1] + fu[j-2]);
		}
		i = j = zflag = fflag = 0;
		sum = 0;
		zero = 0;
	}
	return 0;
}

参考答案(时间最优[0]):

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a,const void *b)
{
	return *(int *)a - *(int *)b;
}

int main()
{
	int n,m,shu,sum = 0,zheng[10],fu[10],i = 0,j = 0,zflag = 0,fflag = 0,k,zero = 0;
	scanf("%d",&n);
	while(n--)
	{
	    scanf("%d",&m);
	    while(m--)
		{
			scanf("%d",&shu);
			if(shu > 0)
			{
				zheng[i++] = shu;
				zflag = 1;
			}
			if(shu < 0)
			{
				fu[j++] = shu;
				fflag = 1;
			}
			if(shu == 0)
			zero = 1;
		}
		if(zflag)
		qsort(zheng,i,sizeof(int),cmp);
		if(fflag)
		qsort(fu,j,sizeof(int),cmp);
		if(zflag)
		{
			for(k = 0;k < i;k++)
			sum += zheng[k];
			if(fflag)
			{
                if((sum - zheng[0]) > (sum + fu[j-1]))
				printf("%d\n",sum - zheng[0]);
				else
				printf("%d\n",sum + fu[j-1]);
			}
			else
			printf("%d\n",sum - zheng[0]);
		}
		else
		{
			if(zero)
			printf("%d\n",fu[j-1] + 0);
			else
			printf("%d\n",fu[j-1] + fu[j-2]);
		}
		i = j = zflag = fflag = 0;
		sum = 0;
		zero = 0;
	}
	return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注