深度优先搜索练习之神奇的矩环

痛定思痛。 2022-07-12 07:49 118阅读 0赞

think:
1感觉自己用的不是深度优先搜索啊,——话落即发现如何判错自己的代码,人果然还是否定自己比较容易..无语啊

sdut原题链接

深度优先搜索练习之神奇的矩环
Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
小鑫的女朋友被魔王抢走了!
魔王留给小鑫一张n*m大的表,上面有各种各样的颜色,用A-Z这26个字母来表示。魔王留给他一个任务,如果小鑫可以在这张表中找出任意一个长度大于1的环,并且这个环的颜色是相同的,魔王就把小鑫的女朋友还给他。为了从魔王手中夺回他的女朋友,小鑫请你帮忙,你能帮帮他吗?

Input
多组输入。
每组的第一行有两个整数n,m。代表表的大小。
接下来是由A-Z的一些字母所构成的n行m列的表。
1<=n,m<=200

Output
如果可以救回他的女朋友,输出Yes,否则输出No

Example Input
4 7
ABCBBAA
BCBCBCB
AABBCCA
ACCCBBB
10 3
AAC
ABB
BBA
AAC
CBC
CCA
CBB
CCA
CCB
BAA

Example Output
No
Yes

Hint

Author

以下为accpted代码——感觉后台数据和自己挺亲的
数据
5 5
AAAAA
ABBBA
AAAAA
CCCCC
AAAAA
即可判错以下代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. int n, m, i, j;
  6. char s[204][204];
  7. while(scanf("%d %d", &n, &m) != EOF)
  8. {
  9. int flag = 0;
  10. for(i = 0; i < n; i++)
  11. {
  12. scanf("%s", s[i]);
  13. }
  14. for(i = 0; i < n-1; i++)
  15. {
  16. for(j = 0; j < m-1; j++)
  17. {
  18. if(s[i][j] == s[i][j+1])
  19. {
  20. if(s[i][j] == s[i+1][j])
  21. {
  22. if(s[i][j] == s[i+1][j+1])
  23. {
  24. flag = 1;
  25. break;
  26. }
  27. }
  28. }
  29. }
  30. if(j != m-1)
  31. break;
  32. }
  33. if(flag)
  34. printf("Yes\n");
  35. else
  36. printf("No\n");
  37. }
  38. return 0;
  39. }
  40. /***************************************************
  41. User name:
  42. Result: Accepted
  43. Take time: 0ms
  44. Take Memory: 120KB
  45. Submit time: 2017-02-16 20:53:44
  46. ****************************************************/

以下为accepted建议参考代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. char map[200][200];
  4. int v[200][200], flag;
  5. void dfs(int x, int y, int x1, int y1, int n, int m)
  6. {
  7. v[x][y] = 1;
  8. if(flag == 1)
  9. {
  10. return;
  11. }
  12. if(y-1 >= 0 && map[x][y] == map[x][y-1])
  13. {
  14. if(v[x][y-1] == 1 && (x != x1 || y-1 != y1))
  15. {
  16. flag = 1;
  17. }
  18. else if(v[x][y-1] == 0)
  19. {
  20. dfs(x, y-1, x, y, n, m);
  21. }
  22. }
  23. if(x-1 >= 0 && map[x][y] == map[x-1][y])
  24. {
  25. if(v[x-1][y] == 1 && (x-1 != x1 || y != y1))
  26. {
  27. flag = 1;
  28. }
  29. else if(v[x-1][y] == 0)
  30. {
  31. dfs(x-1, y, x, y, n, m);
  32. }
  33. }
  34. if(y+1 < m && map[x][y] == map[x][y+1])
  35. {
  36. if(v[x][y+1] == 1 && (x != x1 || y+1 != y1))
  37. {
  38. flag = 1;
  39. }
  40. else if(v[x][y+1] == 0)
  41. {
  42. dfs(x, y+1, x, y, n, m);
  43. }
  44. }
  45. if(x+1 < n && map[x][y] == map[x+1][y])
  46. {
  47. if(v[x+1][y] == 1 && (x+1 != x1 || y != y1))
  48. {
  49. flag = 1;
  50. }
  51. else if(v[x+1][y] == 0)
  52. {
  53. dfs(x+1, y, x, y, n, m);
  54. }
  55. }
  56. }
  57. int main()
  58. {
  59. int n, m, i, j;
  60. while(scanf("%d %d", &n, &m) != EOF)
  61. {
  62. flag = 0;
  63. memset(v, 0, sizeof(v));
  64. for(i = 0; i < n; i++)
  65. {
  66. scanf("%s", map[i]);
  67. }
  68. for(i = 0; i < n; i++)
  69. {
  70. for(j = 0; j < m; j++)
  71. {
  72. if(v[i][j] == 0)
  73. {
  74. dfs(i, j, i, j, n, m);
  75. }
  76. if(flag == 1)
  77. {
  78. break;
  79. }
  80. }
  81. if(j != m)
  82. {
  83. break;
  84. }
  85. }
  86. if(flag)
  87. printf("Yes\n");
  88. else
  89. printf("No\n");
  90. }
  91. return 0;
  92. }
  93. /***************************************************
  94. User name:
  95. Result: Accepted
  96. Take time: 4ms
  97. Take Memory: 280KB
  98. Submit time: 2017-02-16 21:40:33
  99. ****************************************************/

发表评论

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

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

相关阅读