Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我的解法,供参考

Posted by xebec at 2009-05-12 16:45:48 on Problem 1051
字符转Morse码和取Morse码长度用了两个查找表
Morse码转字符按码长分了4个查找表,然后把Morse按二进制转为索引取字符。
为了节省空间只开了8字节的缓冲区来放中间的Morse码,一边将字符串头的字符转为Morse码放进去一边从按字符串尾字符的Morse码长度来从缓冲区里取码。
=============================
Source CodeProblem: 1051		User: xebec
Memory: 336K		Time: 0MS
Language: GCC		Result: Accepted

Source Code
#include <stdio.h>
#include <string.h>

static char *map1[] = {
".-",
"-...",
"-.-.",
"-..",
".",
"..-.",
"--.",
"....",
"..",
".---",
"-.-",
".-..",
"--",
"-.",
"---",
".--.",
"--.-",
".-.",
"...",
"-",
"..-",
"...-",
".--",
"-..-",
"-.--",
"--..",
"..--",
"---.",
".-.-",
"----",
};

static int map2[] = {
2,
4,
4,
3,
1,
4,
3,
4,
2,
4,
3,
4,
2,
2,
3,
4,
4,
3,
3,
1,
3,
4,
3,
4,
4,
4,
4,
4,
4,
4,
};

static char char_map1[] = {
'E',
'T',
};

static char char_map2[] = {
'I',
'A',
'N',
'M',
};

static char char_map3[] = {
'S',
'U',
'R',
'W',
'D',
'K',
'G',
'O',
};

static char char_map4[] = {
'H',
'V',
'F',
'_',

'L',
',',
'P',
'J',

'B',
'X',
'C',
'Y',

'Z',
'Q',
'.',
'?',
};

static char *map_c(char c, int *len)
{
	int i;
	switch(c) {
	case '_':
		i = 26;
		break;
	case '.':
		i = 27;
		break;
	case ',':
		i = 28;
		break;
	case '?':
		i = 29;
		break;
	default:
		i = c - 'A';
		break;
	}

	if(len) *len = map2[i];

	return map1[i];
}

int main() {
	int n_case, i, j, a, b, len, ts, ci;
	char buf[101], t[8];

	scanf("%d\n", &n_case);
	for(i=0; i<n_case; ++i) {
		scanf("%s\n", buf);

		printf("%d: ", i+1);

		a = 0;
		ts = 0;
		b = strlen(buf)-1;

		while(b >= 0) {
			map_c(buf[b--], &len);

			/* produce code into t */
			while(len > ts) {
				char *code;
				int code_len;
				code = map_c(buf[a++], &code_len);
				for(j=0; j<code_len; j++)
					t[ts++] = code[j];
			}

			/* comsume code */
			for(ci=0, j=0; j<len; ++j) {
				ci <<= 1;
				if(t[j] == '-') {
					ci |= 1;
				}
			}

			switch(len) {
			case 1:
				printf("%c", char_map1[ci]); break;
			case 2:
				printf("%c", char_map2[ci]); break;
			case 3:
				printf("%c", char_map3[ci]); break;
			case 4:
				printf("%c", char_map4[ci]); break;
			}

			memmove(t, t+len, ts-len);
			ts -= len;
		}
		printf("\n");
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator