[关闭]
@tenlee 2015-07-28T12:27:02.000000Z 字数 1853 阅读 1630

HDU 5319 Painter(2015多校联合)

HDUOJ


题目链接:戳我

题目大意

一个画笔在画板作画。画笔有两种颜色,且只有两种画法,\/,\即沿着对角线的方向,同理。\只能是红色 R,/只能是蓝色 B。如果一个格子被B R个染一次,就变成绿色 G 。给一个最终状态的画布,求用最少几笔可以到达该最终状态。
每个格子只能被相同颜色染一次,画家可以选择任意起点作为画笔起点。
每一笔都是连续的。

样例解释

2
4
RR.B
.RG.
.BRR
B..R

解题思路

简单题。以每个G为起点,/\各扫一次,最后在扫描有多少连续的\ R和/ B

代码

  1. //Author LJH
  2. //www.cnblogs.com/tenlee
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #define clc(a, b) memset(a, b, sizeof(a))
  14. using namespace std;
  15. const int inf = 0x3f;
  16. const int INF = 0x3f3f3f3f;
  17. const int maxn = 100;
  18. int movex[2][2] = {-1, -1, 1, 1};
  19. int movey[2][2] = {-1, 1, 1, -1};
  20. int n, m, g[maxn][maxn], ans;
  21. bool judge(int x, int y)
  22. {
  23. if(x < 1 || x > n || y < 1 || y > m) return false;
  24. return true;
  25. }
  26. void findx(int x, int y)
  27. {
  28. int a = x, b = y;
  29. g[x][y] -= 1;
  30. while(judge(a, b))
  31. {
  32. a += movex[0][0];
  33. b += movex[0][1];
  34. if(g[a][b] == 2 || g[a][b] == 0) break;
  35. g[a][b] -= 1;
  36. }
  37. a = x, b = y;
  38. while(judge(a, b))
  39. {
  40. a += movex[1][0];
  41. b += movex[1][1];
  42. if(g[a][b] == 2 || g[a][b] == 0) break;
  43. g[a][b] -= 1;
  44. }
  45. }
  46. void findy(int x, int y)
  47. {
  48. g[x][y] -= 2;
  49. int a = x, b = y;
  50. while(judge(a, b))
  51. {
  52. a += movey[0][0];
  53. b += movey[0][1];
  54. if(g[a][b] == 1 || g[a][b] == 0) break;
  55. g[a][b] -= 2;
  56. }
  57. a = x, b = y;
  58. while(judge(a, b))
  59. {
  60. a += movey[1][0];
  61. b += movey[1][1];
  62. if(g[a][b] == 1 || g[a][b] == 0) break;
  63. g[a][b] -= 2;
  64. }
  65. }
  66. void Print()
  67. {
  68. for(int i = 1; i <= n; i++)
  69. {
  70. for(int j = 1; j <= n; j++)
  71. {
  72. printf("%d", g[i][j]);
  73. }
  74. puts("");
  75. }
  76. puts("#####");
  77. }
  78. int main()
  79. {
  80. //freopen("1.in", "r", stdin);
  81. int T;
  82. char col[maxn];
  83. char ch;
  84. scanf("%d", &T);
  85. while(T--)
  86. {
  87. scanf("%d", &n);
  88. clc(g, 0);
  89. ans = 0;
  90. for(int i = 1; i <= n; i++)
  91. {
  92. scanf(" %s", col);
  93. m = strlen(col);
  94. for(int j = 0; col[j]; j++)
  95. {
  96. ch = col[j];
  97. if(ch == 'R') g[i][j+1] = 1;
  98. if(ch == 'B') g[i][j+1] = 2;
  99. if(ch == 'G') g[i][j+1] = 3;
  100. if(ch == '.') g[i][j+1] = 0;
  101. }
  102. }
  103. //Print();
  104. for(int i = 1; i <=n ;i++)
  105. {
  106. for(int j = 1; j <= m; j++)
  107. {
  108. if(g[i][j] == 3)
  109. {
  110. ans += 2;
  111. findx(i, j);
  112. findy(i, j);
  113. }
  114. }
  115. }
  116. //Print();
  117. for(int i = 1; i <= n; i++)
  118. {
  119. for(int j = 1; j <= m; j++)
  120. {
  121. if(g[i][j] == 1)
  122. {
  123. ans++;
  124. findx(i, j);
  125. //Print();
  126. }
  127. if(g[i][j] == 2)
  128. {
  129. ans++;
  130. findy(i, j);
  131. //Print();
  132. }
  133. }
  134. }
  135. //Print();
  136. printf("%d\n", ans);
  137. }
  138. return 0;
  139. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注