当前位置:   article > 正文

acwing2060. 奶牛选美

acwing2060. 奶牛选美

题目:

代码:

  1. //acwing2060. 奶牛选美
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=55;
  7. const int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
  8. bool st[N][N];
  9. int point[N][N];
  10. char map[N][N];
  11. int n,m; //最好定义在全局变量
  12. void dfs(int x,int y,int u)
  13. {
  14. point[x][y]=u; //这个是为了判断哪一块的代码是第一块的还是第二块的
  15. st[x][y]=true;
  16. for(int i=0;i<4;i++)
  17. {
  18. int nx=x+dx[i],ny=y+dy[i];
  19. if(nx>=0&&nx<n&&ny>=0&&y<m&&!st[nx][ny]&&map[nx][ny]=='X')
  20. {
  21. dfs(nx,ny,u);
  22. }
  23. }
  24. }
  25. int main()
  26. {
  27. int cnt=0; //cnt用来计算有多少个连在一起的大黑块
  28. scanf("%d %d",&n,&m);
  29. for(int i = 0;i < n;i ++)
  30. for(int j=0;j<m;j++)
  31. cin >> map[i][j];
  32. for(int i=0;i<n;i++)
  33. for(int j=0;j<m;j++)
  34. {
  35. //少处理边界问题
  36. if(map[i][j]=='X'&&!st[i][j])
  37. {
  38. dfs(i,j,cnt+1); //如果这里用cnt的话,会cnt一直都是0
  39. }
  40. }
  41. int res = n*m;
  42. for(int i = 0; i < n; i ++ )
  43. for(int j = 0; j < m; j ++ )
  44. {
  45. if(point[i][j] == 1)
  46. { for(int k = 0; k < n; k ++ )
  47. for(int u = 0; u < m; u ++ )
  48. {
  49. if(point[k][u]==2) //continue;
  50. res = min(res, abs(i - k) + abs(j - u) - 1);
  51. //最后要减一,比如(1,1)与(1,3)之间只有一个(1,2),做差为2,所以要减一
  52. }
  53. }
  54. }
  55. printf("%d\n", res);
  56. return 0;
  57. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号