• 搜素题目(蓝桥杯 C++ 代码+注解)


    目录

    题目一(小朋友崇拜圈):

    代码:

    题目二(穿越雷区):

    代码: 

     题目三(分考场):

    代码:

     题目四(受伤的皇后):

    代码:

    题目一(小朋友崇拜圈):

    代码:

    1. #include
    2. using namespace std;
    3. int a[100010];
    4. int ans = 0, t;
    5. int book[100010];
    6. void dfs(int k,int sum)
    7. {
    8. if (book[k])//已经访问过,则有可能为环
    9. {
    10. if (k==t)//回到起始,则为环
    11. if (sum > ans)
    12. ans = sum;
    13. return;
    14. }
    15. book[k] = 1;//标记已经访问
    16. dfs(a[k], sum + 1);
    17. book[k] = 0;//回溯
    18. }
    19. int main()
    20. {
    21. int n;
    22. cin >> n;
    23. for (int i = 1; i <= n; i++)
    24. cin >> a[i];
    25. for (int i = 1; i <= n; i++)
    26. {
    27. t = i;
    28. dfs(i, 0);//从第i个人出发可以组成0个人的圈
    29. }
    30. cout << ans;
    31. }

    题目二(穿越雷区):

    代码: 

    1. #include
    2. #include
    3. using namespace std;
    4. char s[110][110];
    5. int book[110][110] = { 0 };
    6. int ans = 0;
    7. int dx[4] = { 1,0,0,-1 };
    8. int dy[4] = { 0,1,-1,0 };
    9. int flag = 0;//标志是否能走通
    10. int n;
    11. typedef struct node
    12. {
    13. int x, y, s;
    14. }node;
    15. node start, end1;
    16. queue q;
    17. int check(int x, int y)//走到终点
    18. {
    19. if (x == end1.x && y == end1.y)
    20. return 1;
    21. return 0;
    22. }
    23. void bfs()
    24. {
    25. while (!q.empty())
    26. {
    27. int x = q.front().x, y = q.front().y;
    28. int step = q.front().s;//走到该点需要的步数
    29. q.pop();
    30. if (check(x, y))
    31. {
    32. flag = 1;
    33. cout << step;
    34. break;
    35. }
    36. for (int k = 0; k < 4; k++)
    37. {
    38. int tx = x + dx[k], ty = y + dy[k];
    39. if (tx<1 || tx>n || ty<1 || ty>n || book[tx][ty]==1)//是否越界,是否走过
    40. continue;
    41. else if (s[x][y]=='A'||(s[x][y] == '+' && s[tx][ty] == '-')||s[tx][ty]=='B')//符合上一步和这一步为不同符号,起点,终点不算
    42. {
    43. q.push({ tx, ty, step + 1 });
    44. book[tx][ty] = 1;
    45. }
    46. else if (s[x][y]=='A'||(s[x][y] == '-' && s[tx][ty] == '+')||s[tx][ty]=='B')
    47. {
    48. q.push({ tx, ty, step + 1 });
    49. book[tx][ty] = 1;
    50. }
    51. }
    52. }
    53. }
    54. int main()
    55. {
    56. cin >> n;
    57. for (int i = 1; i <= n; i++)
    58. {
    59. for (int j = 1; j <= n; j++)
    60. {
    61. cin >> s[i][j];
    62. if (s[i][j] == 'A')
    63. start.x = i, start.y = j;
    64. else if (s[i][j] == 'B')
    65. end1.x = i, end1.y = j;
    66. }
    67. }
    68. q.push({ start.x,start.y,0 });
    69. bfs();
    70. if (flag == 0)
    71. cout << "-1";
    72. }

     题目三(分考场):

    代码:

    1. #include
    2. #include
    3. #include//两种可能,一种加在原有的考场中,一种自己单独开一个考场
    4. using namespace std;
    5. const int N=200;
    6. int st[N][N];
    7. int mp[N][N];//第i个考场的第i位同学
    8. int n,m;
    9. int minkey;
    10. void dfs(int k,int res)//第k个同学,存在res个考场
    11. {
    12. if(res>=minkey)return;//目前的考场数大于了最优考场数,不再继续
    13. if(k>n)//目前遍历的是n+1位同学,没有,已经遍历完了
    14. {
    15. minkey=min(minkey,res);//更新考场数
    16. return ;
    17. }
    18. for(int i=1;i<=res;i++)//依次遍历每个考场,看有没有认识他的
    19. {
    20. int u=1;
    21. while(mp[i][u]&&!st[k][mp[i][u]])//如果第i个考场的第u名同学存在且不认识,继续往后遍历
    22. u++;
    23. //注意这个u如果每个人都不认识的话,这个u代表的是本考场人数加一
    24. //那么这个考场就没有第u个人,
    25. if(!mp[i][u])//没有第u个,让第k个同学成为第u个
    26. {
    27. mp[i][u]=k;
    28. dfs(k+1,res);
    29. mp[i][u]=0;//回溯
    30. }
    31. }
    32. //自己新加一个考场
    33. mp[res+1][1]=k;
    34. dfs(k+1,res+1);
    35. mp[res+1][1]=0;
    36. }
    37. int main()
    38. {
    39. cin>>n>>m;
    40. minkey=n;
    41. while(m--)
    42. {
    43. int a,b;
    44. cin>>a>>b;
    45. st[a][b]=1;//表示ab认识
    46. st[b][a]=1;
    47. }
    48. dfs(1,0);//第1个同学有0个考场
    49. cout<
    50. return 0;
    51. }

     题目四(受伤的皇后):

    代码:

    1. #include
    2. using namespace std;
    3. int a[15];
    4. int ans = 0;
    5. int n;
    6. int check(int a)//判断是否继续摆
    7. {
    8. if (a > n)//大于最大行数,即摆完,方法加一
    9. {
    10. ans++;
    11. return 1;
    12. }
    13. else
    14. return 0;
    15. }
    16. int judge(int k)//判断是否可以摆
    17. {
    18. for (int i = 1; i < k; i++)
    19. {
    20. if (((abs(k - i) == abs(a[k] - a[i]))&&((k-i)<=3))||(a[k] == a[i]))//同一列和斜线
    21. return 0;//同一斜线说明斜率为1或者-1,则x1-x2/y1-y2=1,即x1-x2=y1-y2同时行号差三以上则不用考虑是否在同一斜线
    22. }
    23. return 1;
    24. }
    25. void dfs(int k)
    26. {
    27. if (check(k))
    28. return;
    29. else
    30. {
    31. for (int i = 1; i <= n; i++)//遍历每一列
    32. {
    33. a[k] = i;
    34. if (judge(k))
    35. dfs(k + 1);
    36. else
    37. continue;
    38. }
    39. }
    40. }
    41. int main()
    42. {
    43. cin >> n;
    44. dfs(1);
    45. cout << ans;
    46. }

  • 相关阅读:
    STM32F103C8T6第4天:串口实验(非中断和中断)、hc01蓝牙、esp8266WIFI、4g
    flask搭建简易版学生信息管理系统
    94.(cesium篇)cesium动态单体化-倾斜摄影(楼层)
    9月5日关键点检测学习笔记——人体骨骼点检测:自底向上
    持续测试简介
    CentOS 7 安装新版本的Git
    Leetcode73矩阵置零
    OSMNX 路网数据下载分析Python包
    JWT 登录
    计算机丢失mfc140u.dll怎么办,mfc140u.dll丢失的解决方法分享
  • 原文地址:https://blog.csdn.net/qq_74156152/article/details/136440327