fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. char c[12][6];
  6. int ck=0,ar[12][6];
  7. void dfs(int i, int j,char cc) {
  8. if (i < 0 || i>11 || j < 0 || j>5) {
  9. return;
  10. }
  11. else if(c[i][j]==cc&&ar[i][j]==0){
  12. ar[i][j] = 1;
  13. ck++;
  14. dfs(i + 1, j, cc);
  15. dfs(i - 1, j, cc);
  16. dfs(i, j + 1, cc);
  17. dfs(i, j - 1, cc);
  18. }
  19. }
  20. void bomb() {
  21. for (int i = 0; i < 12; i++) {
  22. for (int j = 0; j < 6; j++) {
  23. if (ar[i][j] == 1) {
  24. c[i][j] = '.';
  25. ar[i][j] = 0;
  26. }
  27. }
  28. }
  29. }
  30. void gravity() {
  31. for (int i = 11; i > 0; i--) {
  32. for (int j = 5; j > 0; j--) {
  33. if (c[i][j] == '.'&&c[i - 1][j] != '.') {
  34. c[i][j] = c[i - 1][j];
  35. c[i - 1][j] = '.';
  36. i = 11;
  37. j = 5;
  38. }
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. int ans = 0,solve=0,check=0;
  45. for (int i = 0; i < 12; i++) {
  46. for (int j = 0; j < 6; j++) {
  47. cin >> c[i][j];
  48. ar[i][j] = 0;
  49. }
  50. }
  51. while (1) { //한번이라도 터지면 뿌요들을 내리고 처음부터 다시 찾아보게 했습니다
  52. for (int i = 0; i < 12; i++) { //맨위 왼쪽부터 차례로 찾습니다
  53. for (int j = 0; j < 6; j++) {
  54. ck = 0;
  55. if (c[i][j] != '.') {
  56. dfs(i, j, c[i][j]);
  57. if (ck >= 4) {//dfs결과 4개 이상의 같은것이 나오면 터트립니다
  58. check++;//터지는게 하나라도 있나 체크합니다(while탈출 정함)
  59. bomb();//방문한 뿌요들을 터트려 '.'로 바꿉니다
  60. }
  61. }
  62. for (int i = 0; i < 12; i++) {
  63. for (int j = 0; j < 6; j++)
  64. ar[i][j] = 0;//방문체크를 다시 0으로 만듭니다
  65. }
  66. }
  67. }
  68. gravity(); //터트린곳 내립니다
  69. if (check > 0) {
  70. ans++;//한번에 터진것은 연쇄 하나로 칩니다
  71. check = 0;
  72. }
  73. else
  74. break;
  75. }
  76. cout << ans;
  77.  
  78. return 0;
  79. }
Success #stdin #stdout 0s 15232KB
stdin
......
......
......
......
......
......
......
Y.....
R.....
R.....
R.....
RYYY..
stdout
1