UVa 1103 - Ancient Messages [进制转换+DFS]

提供三组测试数据吧:

5 3
fff
f0f
fff
f0f
fff
5 5
0fff0
0f0f0
fffff
00f00
00f00
5 5
0f0f0
0f0f0
fffff
00f00
00f00 
0 0

AC输出是:

Case 1: K
Case 2: A
Case 3: W

做题的时候,发现使用ios::sync_with_stdio(false);就会WA,注释掉就AC,不知道是什么情况,正在研究中。

#include <bits/stdc++.h>
using namespace std;

const string dict[16] = {
	"0000", "0001", "0010", "0011",
	"0100", "0101", "0110", "0111",
	"1000", "1001", "1010", "1011",
	"1100", "1101", "1110", "1111",
};
const int dir[4][2] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
const char alp[8] = { 'W', 'A', 'K', 'J', 'S', 'D' };
map<char, int> cnt;
char tab[256][256];
int H, W, kase, cur;

bool isin(const int r, const int c){
	return r >= 0 && r <= H + 1 && c >= 0 && c <= W + 1;
}
void DFS1(const int r, const int c){
	if (!isin(r, c) || tab[r][c]!='0') return;
	tab[r][c] = '-';
	for (int i = 0; i < 4; ++i)
		DFS1(r + dir[i][0], c + dir[i][1]);
}
void DFS2(const int r, const int c){
	if (!isin(r, c) || tab[r][c] != '1') return;
	tab[r][c] = '-';
	for (int i = 0; i < 4; ++i){
		int r1 = r + dir[i][0], c1 = c + dir[i][1];
		if (tab[r1][c1] == '0')
			++cur, DFS1(r1, c1);
		else DFS2(r1, c1);
	}
}
int main()
{
	//ios::sync_with_stdio(false);
	while (memset(tab, '0', sizeof(tab)), cnt.clear(), cin >> H >> W, H || W){
		W *= 4;
		for (int i = 1; i <= H; ++i){
			string line, res; cin >> line;
			for (auto i : line) res += dict[i >= 'a' ? (i - 'a' + 10) : (i - '0')];
			memcpy(tab[i]+1, res.c_str(), W);
		}
		DFS1(0, 0);
		for (int i = 1; i <= H; ++i){
			for (int j = 1; j <= W; ++j){
				if (tab[i][j] != '1') continue;
				cur = 0;
				DFS2(i, j);
				cnt[alp[cur]]++;
			}
		}
		printf("Case %d: ", ++kase);
		for (auto i : cnt) while (i.second--) cout << i.first;
		cout << endl;
	}
	return 0;
}




posted @ 2015-02-28 13:00  Popco  阅读(177)  评论(0编辑  收藏  举报