当前位置:   article > 正文

深度搜索算法2(c++)

深度搜索算法2(c++)

红与黑

题目描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑 色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入

包括多组数据。每组数据的第一行是两个整数W和H,分别表示x方向和y方 向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。 每个字符表示一块瓷砖的颜色,规则如下: 1)‘.’:黑色的瓷砖;

2)‘#’:红色的瓷砖;

3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每组数据中唯一 出现一次。

当在一行中读入的是两个零时,表示输入结束。 输出 对每组数据,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数 时包括初始位置的瓷砖)。

【输入样例】

6 9 
. . . . # .
. . . . . #
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
# @ . . . #
. # . . # .

0 0

【输出样例】

45

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. char a[110][110];
  5. int b[30][30];
  6. int n,m;
  7. int cnt = 1;
  8. int di[] = {0,1,0,-1};
  9. int dj[] = {1,0,-1,0};
  10. void aaa(int,int);
  11. int main()
  12. {
  13. while(true)
  14. {
  15. cin>>m>>n;
  16. if(m==0&&n==0)
  17. {
  18. break;
  19. }
  20. int ii,jj;
  21. for(int i = 0;i<n;i++)
  22. {
  23. for(int j = 0;j<m;j++)
  24. {
  25. cin>>a[i][j];
  26. if(a[i][j]=='@')
  27. {
  28. ii = i;
  29. jj = j;
  30. }
  31. }
  32. }
  33. aaa(ii,jj);
  34. cout<<cnt<<endl;
  35. }
  36. return 0;
  37. }
  38. void aaa(int i,int j)
  39. {
  40. a[i][j] = '#';
  41. b[i][j] = cnt;
  42. for(int qqq = 0;qqq<4;qqq++)
  43. {
  44. int ti = i+di[qqq];
  45. int tj = j+dj[qqq];
  46. if(ti>=0&&ti<n&&tj>=0&&tj<m&&a[ti][tj]!='#')
  47. {
  48. cnt++;
  49. aaa(ti,tj);
  50. }
  51. }
  52. return;
  53. }

泳池

题目描述

小C在一个排水系统不太好的学校上学。又是一个下雨天,学校里高低不平积了很多水。小C突发奇想:如果大雨一直 下,多久以后我可以在学校里游泳呢? 学校是 N x N 的坐标方格 grid 中,每一个方格的值 grid(i,j)表示在位置 (i,j) 的高度。现在开始下雨了。当时间为 t 时, 此时雨水导致方格中任意位置的水位为 t 。你可以从一个方格游向四周相邻的任意一个方格,但是前提是此时水位必 须同时淹没这两个方格。假定小C的游动是不耗时的。 现在小C从坐标方格的左上(0,0)出发。最少耗时多久他才能到达坐标方格的右下平台 (N-1, N-1)?

输入格式

第一行有一个整数N,以下是一个N*N 的方阵,代表各处的高度。

输入范围: 2 ≤ N ≤ 300 0 ≤ Height ≤ 10000000

输出格式

输出一个整数,代表最少等待时间T 样例输入

5
0 1 2 3 4
24 23 22 21 5
12 13 14 15 16
11 17 18 19 20
10 9 8 7 6

样例输出

16

样例解释

时间为16时,水位为16,此时才能保证(0,0) 和(4,4)是联通的(请自行找出一条通路)。

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int n,m;
  5. int a[310][310];
  6. int cnt = 0;
  7. int di[] = {0,1,0,-1};
  8. int dj[] = {1,0,-1,0};
  9. bool f = false;
  10. void aaa(int,int);
  11. int main()
  12. {
  13. cin>>n;
  14. for(int i = 0;i<n;i++)
  15. {
  16. for(int j = 0;j<n;j++)
  17. {
  18. cin>>a[i][j];
  19. }
  20. }
  21. cnt = a[n-1][n-1];
  22. for(int i = 0;i<n;i++)
  23. {
  24. for(int j = 0;j<n;j++)
  25. {
  26. if(a[i][j]-a[n-1][n-1]>=0)
  27. {
  28. a[i][j] = a[i][j]-a[n-1][n-1];
  29. }
  30. else
  31. {
  32. a[i][j] = 0;
  33. }
  34. }
  35. }
  36. while(true)
  37. {
  38. aaa(0,0);
  39. if(f==true)
  40. {
  41. break;
  42. }
  43. cnt++;
  44. for(int i = 0;i<n;i++)
  45. {
  46. for(int j = 0;j<n;j++)
  47. {
  48. if(a[i][j]>0)
  49. {
  50. a[i][j]--;
  51. }
  52. }
  53. }
  54. }
  55. cout<<cnt;
  56. return 0;
  57. }
  58. void aaa(int i,int j)
  59. {
  60. if(i==n-1&&j==n-1)
  61. {
  62. f = true;
  63. return;
  64. }
  65. for(int qqq = 0;qqq<4;qqq++)
  66. {
  67. int ti = i+di[qqq];
  68. int tj = j+dj[qqq];
  69. if(ti>=0&&ti<n&&tj>=0&&tj<n&&a[ti][tj]==0)
  70. {
  71. a[ti][tj] = -1;
  72. aaa(ti,tj);
  73. a[ti][tj] = 0;
  74. }
  75. }
  76. return;
  77. }

  1. #include <iostream>
  2. using namespace std;
  3. int a[110][110];
  4. int b[110][110];
  5. int n,m;
  6. int cnt = 0;
  7. int cntt = 0;
  8. int ma = -99999;
  9. int di[] = {0,1,0,-1};
  10. int dj[] = {1,0,-1,0};
  11. void aaa(int,int);
  12. int main()
  13. {
  14. cin>>n>>m;
  15. for(int i = 0;i<n;i++)
  16. {
  17. for(int j = 0;j<m;j++)
  18. {
  19. cin>>a[i][j];
  20. }
  21. }
  22. for(int i = 0;i<n;i++)
  23. {
  24. for(int j = 0;j<m;j++)
  25. {
  26. if(b[i][j]==0)
  27. {
  28. cnt++;
  29. aaa(i,j);
  30. ma = max(ma,cntt);
  31. cntt = 0;
  32. }
  33. }
  34. }
  35. cout<<cnt<<endl<<ma;
  36. return 0;
  37. }
  38. void aaa(int i,int j)
  39. {
  40. cntt++;
  41. b[i][j] = 1;
  42. for(int qqq = 0;qqq<4;qqq++)
  43. {
  44. int ti = i+di[qqq];
  45. int tj = j+dj[qqq];
  46. if(ti>=0&&ti<n&&tj>=0&&tj<m&&b[ti][tj]==0)
  47. {
  48. if(qqq==0)
  49. {
  50. if(a[i][j]==1||a[i][j]==2||a[i][j]==8||a[i][j]==3||a[i][j]==9||a[i][j]==10||a[i][j]==11||a[i][j]==0)
  51. {
  52. aaa(ti,tj);
  53. }
  54. }
  55. if(qqq==1)
  56. {
  57. if(a[i][j]==1||a[i][j]==2||a[i][j]==4||a[i][j]==3||a[i][j]==5||a[i][j]==6||a[i][j]==7||a[i][j]==0)
  58. {
  59. aaa(ti,tj);
  60. }
  61. }
  62. if(qqq==2)
  63. {
  64. if(a[i][j]==2||a[i][j]==4||a[i][j]==8||a[i][j]==6||a[i][j]==10||a[i][j]==12||a[i][j]==14||a[i][j]==0)
  65. {
  66. aaa(ti,tj);
  67. }
  68. }
  69. if(qqq==3)
  70. {
  71. if(a[i][j]==1||a[i][j]==4||a[i][j]==8||a[i][j]==5||a[i][j]==9||a[i][j]==12||a[i][j]==13||a[i][j]==0)
  72. {
  73. aaa(ti,tj);
  74. }
  75. }
  76. }
  77. }
  78. return;
  79. }

  1. #include <iostream>
  2. using namespace std;
  3. char a[110][110];
  4. int n,m;
  5. int di[] = {0,1,0,-1};
  6. int dj[] = {1,0,-1,0};
  7. void aaa(int,int);
  8. int main()
  9. {
  10. int nn;
  11. cin>>nn;
  12. for(int iii = 0;iii<nn;iii++)
  13. {
  14. cin>>n>>m;
  15. for(int i = 0;i<n;i++)
  16. {
  17. for(int j = 0;j<m;j++)
  18. {
  19. cin>>a[i][j];
  20. }
  21. }
  22. for(int i = 0;i<n;i++)
  23. {
  24. if(a[i][0]=='O')
  25. {
  26. aaa(i,0);
  27. }
  28. }
  29. for(int i = 0;i<n;i++)
  30. {
  31. if(a[i][m-1]=='O')
  32. {
  33. aaa(i,m-1);
  34. }
  35. }
  36. for(int i = 0;i<m;i++)
  37. {
  38. if(a[0][i]=='O')
  39. {
  40. aaa(0,i);
  41. }
  42. }
  43. for(int i = 0;i<m;i++)
  44. {
  45. if(a[n-1][i]=='O')
  46. {
  47. aaa(n-1,i);
  48. }
  49. }
  50. cout<<endl;
  51. for(int i = 0;i<n;i++)
  52. {
  53. for(int j = 0;j<m;j++)
  54. {
  55. if(a[i][j]=='O')
  56. {
  57. a[i][j] = 'X';
  58. }
  59. if(a[i][j]=='0')
  60. {
  61. a[i][j] = 'O';
  62. }
  63. cout<<a[i][j];
  64. }
  65. cout<<endl;
  66. }
  67. }
  68. return 0;
  69. }
  70. void aaa(int i,int j)
  71. {
  72. a[i][j] = '0';
  73. for(int qqq = 0;qqq<4;qqq++)
  74. {
  75. int ti = i+di[qqq];
  76. int tj = j+dj[qqq];
  77. if(ti>=0&&ti<n&&tj>=0&&tj<m&&a[ti][tj]=='O')
  78. {
  79. aaa(ti,tj);
  80. }
  81. }
  82. return;
  83. }

 

走迷宫

描述

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可 以走。 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。

只能在水平方向或垂直方向走,不能斜着走。

输入

第一行是两个整数,R和C,代表迷宫的长和宽。

空地格子用'.'表示,有障碍物的格子用'#'表示。 迷宫左上角和右下角都是'.'

输出

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点

样例输入

5 5
..###
#....
#.#.#
#.#.#
#.#..

样例输出

9

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. char a[50][50];
  5. int n,m;
  6. int si = 0,sj = 0,ei,ej;
  7. int cnt = 0;
  8. int mi = 99999;
  9. bool f = false;
  10. int di[] = {0,1,0,-1};
  11. int dj[] = {1,0,-1,0};
  12. void aaa(int,int);
  13. int main()
  14. {
  15. cin>>n>>m;
  16. for(int i = 0;i<n;i++)
  17. {
  18. for(int j = 0;j<m;j++)
  19. {
  20. cin>>a[i][j];
  21. }
  22. }
  23. ei = n-1;
  24. ej = n-1;
  25. aaa(si,sj);
  26. cout<<cnt;
  27. return 0;
  28. }
  29. void aaa(int i,int j)
  30. {
  31. if(i==ei&&j==ej)
  32. {
  33. f = true;
  34. return;
  35. }
  36. cnt++;
  37. for(int qqq = 0;qqq<4;qqq++)
  38. {
  39. int ti = i+di[qqq];
  40. int tj = j+dj[qqq];
  41. if(ti>=0&&ti<n&&tj>=0&&tj<m&&a[ti][tj]=='.'&&f==false)
  42. {
  43. a[ti][tj] = '#';
  44. aaa(ti,tj);
  45. a[ti][tj] = '.';
  46. }
  47. }
  48. return;
  49. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/708458
推荐阅读
相关标签
  

闽ICP备14008679号