UVA 1103 Ancient Messages

以你之姓@ 2023-06-04 13:59 103阅读 0赞

题目链接:https://vjudge.net/problem/UVA-1103

题目大意

  给定一张关于古代象形文字的 01 点阵图(输入以十六进制表示),判断图中有哪些象形文字,并按字典序输出。

分析

  居然是按洞的多少来区别象形文字的,我也是服了,dfs 裸题。

代码如下

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 #include <bits/stdc++.h>
  2. 2 using namespace std;
  3. 3
  4. 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  5. 5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i)
  6. 6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i)
  7. 7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i)
  8. 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
  9. 9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
  10. 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
  11. 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
  12. 12
  13. 13 #define pr(x) cout << #x << " = " << x << " "
  14. 14 #define prln(x) cout << #x << " = " << x << endl
  15. 15
  16. 16 #define LOWBIT(x) ((x)&(-x))
  17. 17
  18. 18 #define ALL(x) x.begin(),x.end()
  19. 19 #define INS(x) inserter(x,x.begin())
  20. 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
  21. 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c
  22. 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
  23. 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
  24. 24
  25. 25 #define ms0(a) memset(a,0,sizeof(a))
  26. 26 #define msI(a) memset(a,0x3f,sizeof(a))
  27. 27 #define msM(a) memset(a,-1,sizeof(a))
  28. 28
  29. 29 #define MP make_pair
  30. 30 #define PB push_back
  31. 31 #define ft first
  32. 32 #define sd second
  33. 33
  34. 34 template<typename T1, typename T2>
  35. 35 istream &operator>>(istream &in, pair<T1, T2> &p) {
  36. 36 in >> p.first >> p.second;
  37. 37 return in;
  38. 38 }
  39. 39
  40. 40 template<typename T>
  41. 41 istream &operator>>(istream &in, vector<T> &v) {
  42. 42 for (auto &x: v)
  43. 43 in >> x;
  44. 44 return in;
  45. 45 }
  46. 46
  47. 47 template<typename T>
  48. 48 ostream &operator<<(ostream &out, vector<T> &v) {
  49. 49 Rep(i, v.size()) out << v[i] << " \n"[i == v.size() - 1];
  50. 50 return out;
  51. 51 }
  52. 52
  53. 53 template<typename T1, typename T2>
  54. 54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
  55. 55 out << "[" << p.first << ", " << p.second << "]" << "\n";
  56. 56 return out;
  57. 57 }
  58. 58
  59. 59 inline int gc(){
  60. 60 static const int BUF = 1e7;
  61. 61 static char buf[BUF], *bg = buf + BUF, *ed = bg;
  62. 62
  63. 63 if(bg == ed) fread(bg = buf, 1, BUF, stdin);
  64. 64 return *bg++;
  65. 65 }
  66. 66
  67. 67 inline int ri(){
  68. 68 int x = 0, f = 1, c = gc();
  69. 69 for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
  70. 70 for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
  71. 71 return x*f;
  72. 72 }
  73. 73
  74. 74 template<class T>
  75. 75 inline string toString(T x) {
  76. 76 ostringstream sout;
  77. 77 sout << x;
  78. 78 return sout.str();
  79. 79 }
  80. 80
  81. 81 inline int toInt(string s) {
  82. 82 int v;
  83. 83 istringstream sin(s);
  84. 84 sin >> v;
  85. 85 return v;
  86. 86 }
  87. 87
  88. 88 //min <= aim <= max
  89. 89 template<typename T>
  90. 90 inline bool BETWEEN(const T aim, const T min, const T max) {
  91. 91 return min <= aim && aim <= max;
  92. 92 }
  93. 93
  94. 94 typedef unsigned int uI;
  95. 95 typedef long long LL;
  96. 96 typedef unsigned long long uLL;
  97. 97 typedef vector< int > VI;
  98. 98 typedef vector< bool > VB;
  99. 99 typedef vector< char > VC;
  100. 100 typedef vector< double > VD;
  101. 101 typedef vector< string > VS;
  102. 102 typedef vector< LL > VL;
  103. 103 typedef vector< VI > VVI;
  104. 104 typedef vector< VB > VVB;
  105. 105 typedef vector< VS > VVS;
  106. 106 typedef vector< VL > VVL;
  107. 107 typedef vector< VVI > VVVI;
  108. 108 typedef vector< VVL > VVVL;
  109. 109 typedef pair< int, int > PII;
  110. 110 typedef pair< LL, LL > PLL;
  111. 111 typedef pair< int, string > PIS;
  112. 112 typedef pair< string, int > PSI;
  113. 113 typedef pair< string, string > PSS;
  114. 114 typedef pair< double, double > PDD;
  115. 115 typedef vector< PII > VPII;
  116. 116 typedef vector< PLL > VPLL;
  117. 117 typedef vector< VPII > VVPII;
  118. 118 typedef vector< VPLL > VVPLL;
  119. 119 typedef vector< VS > VVS;
  120. 120 typedef map< int, int > MII;
  121. 121 typedef unordered_map< int, int > uMII;
  122. 122 typedef map< LL, LL > MLL;
  123. 123 typedef map< string, int > MSI;
  124. 124 typedef map< int, string > MIS;
  125. 125 typedef multiset< int > mSI;
  126. 126 typedef multiset< char > mSC;
  127. 127 typedef set< int > SI;
  128. 128 typedef stack< int > SKI;
  129. 129 typedef deque< int > DQI;
  130. 130 typedef queue< int > QI;
  131. 131 typedef priority_queue< int > PQIMax;
  132. 132 typedef priority_queue< int, VI, greater< int > > PQIMin;
  133. 133 const double EPS = 1e-8;
  134. 134 const LL inf = 0x7fffffff;
  135. 135 const LL infLL = 0x7fffffffffffffffLL;
  136. 136 const LL mod = 1e9 + 7;
  137. 137 const int maxN = 2e2 + 7;
  138. 138 const LL ONE = 1;
  139. 139 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
  140. 140 const LL oddBits = 0x5555555555555555;
  141. 141
  142. 142 int T, N, M;
  143. 143 int bitArr[maxN][maxN];
  144. 144 mSC ans;
  145. 145 int dx[] = {-1, 0, 1, 0};
  146. 146 int dy[] = {
  147. 0, -1, 0, 1};
  148. 147 map< int, char > dict = {PII(1, 'A'), PII(3, 'J'), PII(5, 'D'), PII(4, 'S'), PII(0, 'W'), PII(2, 'K')};
  149. 148
  150. 149 // 把与bitArr[x][y] = 0联通的联通 0 区域全部置为-1
  151. 150 void dfs1(int x, int y) {
  152. 151 bitArr[x][y] = -1;
  153. 152
  154. 153 Rep(i, 4) {
  155. 154 int newX = x + dx[i];
  156. 155 int newY = y + dy[i];
  157. 156
  158. 157 if(!BETWEEN(newX, 0, N + 1) || !BETWEEN(newY, 0, M + 1) || bitArr[newX][newY] != 0) continue;
  159. 158 dfs1(newX, newY);
  160. 159 }
  161. 160 }
  162. 161
  163. 162 // 把与bitArr[x][y] = 1联通的联通 1 区域全部置为-1,并返回0联通区数量
  164. 163 int dfs2(int x, int y) {
  165. 164 int ret = 0;
  166. 165 bitArr[x][y] = -1;
  167. 166
  168. 167 Rep(i, 4) {
  169. 168 int newX = x + dx[i];
  170. 169 int newY = y + dy[i];
  171. 170
  172. 171 if(!BETWEEN(newX, 0, N + 1) || !BETWEEN(newY, 0, M + 1)) continue;
  173. 172 if(bitArr[newX][newY] == 1) {
  174. 173 ret += dfs2(newX, newY);
  175. 174 }
  176. 175 else if(bitArr[newX][newY] == 0) {
  177. 176 dfs1(newX, newY);
  178. 177 ++ret;
  179. 178 }
  180. 179 }
  181. 180 return ret;
  182. 181 }
  183. 182
  184. 183 void print() {
  185. 184 For(i, 1, N) {
  186. 185 For(j, 1, M) {
  187. 186 if(bitArr[i][j] != -1) cout << bitArr[i][j];
  188. 187 else cout << " ";
  189. 188 }
  190. 189 cout << endl;
  191. 190 }
  192. 191 }
  193. 192
  194. 193 int main() {
  195. 194 //freopen("MyOutput.txt","w",stdout);
  196. 195 //freopen("input.txt","r",stdin);
  197. 196 //INIT();
  198. 197 while(cin >> N >> M && N) {
  199. 198 ms0(bitArr);
  200. 199 ans.clear();
  201. 200 For(i, 1, N) {
  202. 201 Rep(j, M) {
  203. 202 int x;
  204. 203 scanf("%1x", &x);
  205. 204
  206. 205 For(k, 1, 4) {
  207. 206 bitArr[i][(j << 2) + (5 - k)] = ((x & (1 << (k - 1))) != 0);
  208. 207 }
  209. 208 }
  210. 209 }
  211. 210 M <<= 2;
  212. 211
  213. 212 dfs1(0, 0);
  214. 213
  215. 214 For(i, 1, N) {
  216. 215 For(j, 1, M) {
  217. 216 if(bitArr[i][j] < 0) continue;
  218. 217 int ret = dfs2(i, j);
  219. 218 ans.insert(dict[ret]);
  220. 219 }
  221. 220 }
  222. 221
  223. 222 printf("Case %d: ", ++T);
  224. 223 for(auto x : ans) cout << x;
  225. 224 printf("\n");
  226. 225 }
  227. 226 return 0;
  228. 227 }

转载于:https://www.cnblogs.com/zaq19970105/p/11398539.html

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读

    相关 1103. 分糖果 II

    排排坐,分糖果。 我们买了一些糖果 `candies`,打算把它们分给排好队的 `n = num_people` 个小朋友。 给第一个小朋友 1 颗糖果,第二个小朋友 2

    相关 1103. 分糖果 II

    排排坐,分糖果。 我们买了一些糖果 candies,打算把它们分给排好队的 n = num\_people 个小朋友。 给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依

    相关 POJ2159 Ancient Cipher

    题目大意:字符串加密问题,采用字符替换和重新排列的综合方法加密。输入为加密串和字符串,不含空格的大写字母。 解题思路:两种加密方法在具体过程中应用并不唯一,即我们不