当前位置:   article > 正文

编程2222_7-1 地下迷宫探索

7-1 地下迷宫探索

7-2 寻找大富翁

  1. #include<stdio.h> //堆排序; 注意:此算法中,下标从1开始
  2. #define max 1000010
  3. int num[max];
  4. void sift(int *num,int low,int high) //将下标为low位置上的点调到适当位置
  5. {
  6. int i,j,temp;
  7. i=low; j=2*i; //num[j]是num[i]的左孩子结点;
  8. temp=num[i]; //待调整的结点
  9. while(j<=high)
  10. {
  11. if(j<high&&num[j]<num[j+1]) //如果右孩子比较大,则把j指向右孩子,j变为2*i+1
  12. ++j;
  13. if(temp<num[j])
  14. {
  15. num[i]=num[j]; //将num[j]调整到双亲结点的位置上;
  16. i=j; //修改i和j的值,以便继续向下调整;
  17. j=i*2;
  18. }
  19. else break; //调整结束;
  20. }
  21. num[i]=temp; //被调整的结点放入最终位置
  22. }
  23. int main()
  24. {
  25. int n,m,i,temp,count=0;
  26. scanf("%d%d",&n,&m);
  27. for(i=1;i<=n;i++)
  28. scanf("%d",&num[i]);
  29. if(n<m) m=n; //注意,有一个测试点是n小于m的情况,这时,只用排前n个;
  30. for(i=n/2;i>=1;i--) //所有结点建立初始堆
  31. sift(num,i,n);
  32. for(i=n;i>=2;i--) //进行n-1次循环,完成堆排序
  33. {
  34. /*以下3句换出了根节点中的关键字,将其放入最终位置*/
  35. temp=num[1];
  36. num[1]=num[i];
  37. num[i]=temp;
  38. count++;
  39. if(count==1)
  40. printf("%d",num[i]);
  41. else
  42. printf(" %d",num[i]);
  43. if(count==m) break; //打印前m个;
  44. sift(num,1,i-1); //减少了1个关键字的无序序列,继续调整。
  45. }
  46. if(m==n) printf(" %d",num[1]); //当n<m的特殊情况下,上面只打印了n~2,还有最后一个下标为1的没有打印,故再打印一个。
  47. return 0;
  48. }

7-1 公路村村通

  1. #include<stdio.h>
  2. #define inf 0x3f3f3f3f
  3. int size=0;
  4. typedef struct NODE node;
  5. struct NODE{
  6. int cell;//节点是谁
  7. int key;
  8. };
  9. void heapify(node *am,int i)
  10. {
  11. int l,r,min;
  12. while(1)
  13. {
  14. l=i<<1;
  15. r=i<<1|1;
  16. if(l<=size&&am[l].key<am[i].key) min=l;
  17. else min=i;
  18. if(r<=size&&am[r].key<am[min].key) min=r;
  19. if(min==i) return;
  20. node t=am[min];
  21. am[min]=am[i];
  22. am[i]=t;
  23. i=min;
  24. }
  25. }
  26. node extract_min(node *am)
  27. {
  28. node tep=am[1];
  29. am[1]=am[size--];
  30. heapify(am,1);
  31. return tep;
  32. }
  33. void change(node *am,int i)
  34. {
  35. while(i>1&&am[i>>1].key>am[i].key)
  36. {
  37. node tep=am[i>>1];
  38. am[i>>1]=am[i];
  39. am[i]=tep;
  40. i=i>>1;
  41. }
  42. }
  43. int findit(node *dis,int v)
  44. {
  45. for(int i=1;i<=size;i++)
  46. {
  47. if(dis[i].cell==v)
  48. {
  49. return i;
  50. }
  51. }
  52. }
  53. int cost[1001][1001]={0};
  54. int main(void)
  55. {
  56. node dis[1002];
  57. node tep[1002];
  58. int n,m;
  59. scanf("%d%d",&n,&m);
  60. size=n;
  61. for(int i=1;i<=n;i++)//初始化,dis是队列,tep保存结点的更新情况
  62. {
  63. dis[i].key=tep[i].key=inf;
  64. dis[i].cell=tep[i].cell=i;
  65. }
  66. for(int i=1;i<=m;i++)
  67. {
  68. int r1,r2,co;
  69. scanf("%d%d%d",&r1,&r2,&co);
  70. cost[r1][r2]=co;
  71. cost[r2][r1]=co;
  72. }
  73. int ans=0;
  74. dis[1].key=0;//初始时,设根结点1的路径长度为0
  75. int mark[1002]={0};//标记有木有在生成树里面
  76. int flag=0;
  77. while(size!=0)
  78. {
  79. node u=extract_min(dis);
  80. if(u.key==inf)
  81. {
  82. flag=1;
  83. break;
  84. }
  85. mark[u.cell]=1;
  86. ans+=u.key;
  87. for(int v=1;v<=n;v++)//用临接链表更快,但也麻烦
  88. {
  89. if(cost[u.cell][v]!=0&&mark[v]==0&&cost[u.cell][v]<tep[v].key)
  90. {
  91. int t=findit(dis,v);//找到结点v在队列里的位置
  92. tep[v].key=cost[u.cell][v];
  93. dis[t].key=cost[u.cell][v];
  94. change(dis,t);//更新队列
  95. }
  96. }
  97. }
  98. if(flag)printf("-1\n");
  99. else printf("%d\n",ans);
  100. }

7-1 地下迷宫探索

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int vis[1010],r[1010][1010],path[1010];
  4. int n,m,s,j=0,cnt=1; //cnt统计可以点亮的灯个数
  5. void dsf(int x){
  6. for(int i=1; i<=n; i++){
  7. if(r[x][i]&&!vis[i]){
  8. cnt++;
  9. vis[i]=1;
  10. //核心*************
  11. path[j++]=i;//保存去的结点
  12. dsf(i);
  13. path[j++]=x; //保存回去的路
  14. //*************
  15. }
  16. }
  17. }
  18. int main(){
  19. ios::sync_with_stdio(false);
  20. cin>>n>>m>>s;
  21. while(m--){
  22. int a,b;
  23. cin>>a>>b;
  24. r[a][b]=1;
  25. r[b][a]=1;
  26. }
  27. path[j++]=s;
  28. vis[s]=1;
  29. dsf(s);
  30. for(int i=0; i<j; i++){
  31. if(i!=0) cout<<" ";
  32. cout<<path[i];
  33. }
  34. if(cnt<n) cout<<" 0"<<endl;
  35. return 0;
  36. }

 

7-2 深入虎穴

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int n;
  5. cin>>n;
  6. vector<int> e[n+1];
  7. vector<int> vis(n+1,0);
  8. for(int i = 1;i <= n;i++){
  9. int t;
  10. cin>>t;
  11. for(int j = 0;j < t;j++){
  12. int a;
  13. cin>>a;
  14. vis[a] = 1;
  15. e[i].push_back(a);
  16. }
  17. }
  18. queue<int> q;
  19. //找到入口并将入口入队
  20. for(int i = 1;i <= n;i++){
  21. if(vis[i] == 0){
  22. q.push(i);
  23. break;
  24. }
  25. }
  26. int u = -1;
  27. //从入口开始bfs
  28. while(!q.empty()){
  29. u = q.front();
  30. q.pop();
  31. for(auto i : e[u]){
  32. q.push(i);
  33. }
  34. }
  35. //输出
  36. cout<<u<<endl;
  37. return 0;
  38. }

7-1 那就别担心了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 510;
  4. int n,m,s,t;
  5. vector<int> ve[maxn];
  6. int dp[maxn];
  7. int dfs(int x){
  8. if(dp[x]) return dp[x];
  9. if(x == t) return 1;
  10. for(auto v : ve[x]){
  11. dp[x] += dfs(v);
  12. }
  13. return dp[x];
  14. }
  15. int vis[maxn];
  16. queue<int> que;
  17. int bfs(){
  18. que.push(s);
  19. while(!que.empty()){
  20. int tp = que.front();
  21. que.pop();
  22. if(vis[tp]) continue;
  23. vis[tp] = 1;
  24. if(tp == t) continue;
  25. if(!dp[tp]) return 0;
  26. for(auto x : ve[tp]){
  27. que.push(x);
  28. }
  29. }
  30. return 1;
  31. }
  32. int main(){
  33. ios::sync_with_stdio(0);
  34. cin >> n >> m;
  35. for(int i = 0; i < m; i++){
  36. int a,b;cin >> a >> b;
  37. ve[a].push_back(b);
  38. }
  39. cin >> s >> t;
  40. dfs(s);
  41. //for(int i = 1; i <= n; i++){
  42. // cout << " " << dp[i] << endl;
  43. // }
  44. cout << dp[s] << " ";
  45. if(bfs()) cout << "Yes" << endl;
  46. else cout << "No" << endl;
  47. return 0;
  48. }

 

1-1 新浪微博热门话题

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #define MAXLENTH 1000007
  5. typedef struct node *Node;
  6. struct node {
  7. char* KTitle;//整理后的话题
  8. int Times;//提到次数
  9. int LastTimeWhoPost;//最近一次提及它的是哪条微博(用于去重)
  10. };
  11. void Scan(int);
  12. int HashKey(char*);
  13. int Mod(int);
  14. void Insert(int,char*);
  15. Node Hash[MAXLENTH];//散列存储
  16. Node Titles[MAXLENTH]; // 建立双索引
  17. int SumofTitles=0;//话题总数
  18. int main() {
  19. int n;
  20. scanf("%d",&n);
  21. getchar();
  22. for(int i=0; i<n; i++) {
  23. Scan(i);
  24. }
  25. Node MostTimes=Titles[0];
  26. int NumofMost=0;
  27. for(int i=1; i<SumofTitles; i++) {
  28. // printf("{%s--%d}",Titles[i]->KTitle,Titles[i]->Times);
  29. if(Titles[i]->Times>MostTimes->Times) {
  30. MostTimes=Titles[i];
  31. NumofMost=0;
  32. } else if(Titles[i]->Times==MostTimes->Times) {
  33. if(strcmp(Titles[i]->KTitle,MostTimes->KTitle)<0) {
  34. MostTimes=Titles[i];
  35. }
  36. ++NumofMost;
  37. }
  38. }
  39. if(MostTimes->KTitle[0]>='a'&&MostTimes->KTitle[0]<='z')MostTimes->KTitle[0]+='A'-'a';
  40. printf("%s\n%d",MostTimes->KTitle,MostTimes->Times);
  41. if(NumofMost) {
  42. printf("\nAnd %d more ...",NumofMost);
  43. }
  44. return 0;
  45. }
  46. void Scan(int NumofWeibo) {
  47. char temp[141];//每行给出一条英文微博,其长度不超过140个字符
  48. // getchar();
  49. gets(temp);
  50. int Flag_Jin=0;
  51. char title[141];
  52. int Flag_Space=1;
  53. // printf("{S-%s}\n",temp);
  54. for(char*i=temp,*j=title; *i!='\0'; i++) {
  55. if(Flag_Jin==1) {
  56. switch(*i) {
  57. case '#':
  58. while(*(j-1)==' ')--j;
  59. *j='\0';
  60. if(strlen(title)>0)//两个连续的#是空话题,不予计数
  61. Insert(NumofWeibo,title);
  62. Flag_Jin=0;
  63. j=title;
  64. break;
  65. case 'a'...'z':
  66. case '0'...'9':
  67. *j++=*i;
  68. Flag_Space=0;
  69. break;
  70. case 'A'...'Z':
  71. *j++=*i-'A'+'a';
  72. Flag_Space=0;
  73. break;
  74. default:
  75. if(Flag_Space==0) {
  76. *j++=' ';
  77. Flag_Space=1;
  78. }
  79. break;
  80. }
  81. } else if(*i=='#') {
  82. Flag_Jin=1;
  83. Flag_Space=1;
  84. }
  85. }
  86. }
  87. int HashKey(char*K) {
  88. // printf("&");
  89. unsigned int n=0;
  90. while(*K) {
  91. n+=*K-'a';
  92. n<<=5;
  93. // printf("(%d)",n);
  94. K++;
  95. }
  96. // printf("*-*");
  97. return n;
  98. }
  99. int Mod(int n) {
  100. while(n<0)n+=MAXLENTH;
  101. return n%MAXLENTH;
  102. }
  103. void Insert(int NumofWeibo,char*t) {//比较后插入散列表并更新话题原型
  104. // printf("{I-%s}",t);
  105. int Key=HashKey(t);
  106. int i=0,j=0;
  107. for( ; i<=MAXLENTH/2; i++) {
  108. j=Mod(Key+i);
  109. if(Hash[j]) {
  110. if(strcmp(t,Hash[j]->KTitle)==0) {
  111. if(Hash[j]->LastTimeWhoPost==NumofWeibo)return;
  112. ++Hash[j]->Times;
  113. Hash[j]->LastTimeWhoPost=NumofWeibo;
  114. // printf("{add:%s}",Hash[j]->KTitle);
  115. }
  116. } else break;
  117. j=Mod(Key-i);
  118. if(Hash[j]) {
  119. if(strcmp(t,Hash[j]->KTitle)==0) {
  120. if(Hash[j]->LastTimeWhoPost==NumofWeibo)return;
  121. ++Hash[j]->Times;
  122. Hash[j]->LastTimeWhoPost=NumofWeibo;
  123. // printf("{add:%s}",Hash[j]->KTitle);
  124. }
  125. } else break;
  126. }
  127. if(i>MAXLENTH/2) {
  128. // printf("NOT ENOUGH SPACE");
  129. exit(1);
  130. }
  131. Hash[j]=(Node)malloc(sizeof(struct node));
  132. Hash[j]->KTitle=(char*)malloc(strlen(t));
  133. strcpy(Hash[j]->KTitle,t);
  134. Hash[j]->Times=1;
  135. Hash[j]->LastTimeWhoPost=NumofWeibo;
  136. Titles[SumofTitles++]=Hash[j];//把新加入的元素在哈希表中的地址保存进数组。方便遍历。
  137. // printf("{new:%s}",Hash[j]->KTitle);
  138. }

 

7-1 修理牧场

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<queue>
  4. using namespace std;
  5. const int maxn=10010;
  6. priority_queue<int,vector<int>,greater<int> > q;
  7. int main(){
  8. int n,k;
  9. cin>>n;
  10. while(n--){
  11. cin>>k;
  12. q.push(k);
  13. }
  14. int ans=0;
  15. while(q.size()>1){
  16. int x=q.top();
  17. q.pop();
  18. int y=q.top();
  19. q.pop();
  20. ans+=x+y;
  21. q.push(x+y);
  22. }
  23. cout<<ans<<endl;
  24. }

1-1 二叉排序树查找操作


BSTree SearchBST(BSTree T,ElemType e){
    if(!T||T->data==e)return T;
    else if(e<T->data)return SearchBST(T->lchild,e);
    else
        return SearchBST(T->rchild,e);
}

2-1 平衡二叉树的根

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. typedef struct node *AVLTree;
  4. struct node{
  5. int Data;
  6. AVLTree Left;
  7. AVLTree Right;
  8. };
  9. int High(AVLTree T){
  10. if(!T)
  11. return 0;
  12. int left=High(T->Left)+1;
  13. int right=High(T->Right)+1;
  14. return left>right?left:right;
  15. }
  16. AVLTree LL(AVLTree T){
  17. AVLTree T1;
  18. T1=T->Right;
  19. T->Right=T1->Left;
  20. T1->Left=T;
  21. return T1;
  22. }
  23. AVLTree RR(AVLTree T){
  24. AVLTree T1;
  25. T1=T->Left;
  26. T->Left=T1->Right;
  27. T1->Right=T;
  28. return T1;
  29. }
  30. AVLTree LR(AVLTree T){
  31. AVLTree T1,T2;
  32. T1=T->Left;
  33. T2=T1->Right;
  34. T->Left=NULL;
  35. T2->Right=T;
  36. T1->Right=NULL;
  37. T2->Left=T1;
  38. return T2;
  39. }
  40. AVLTree RL(AVLTree T){
  41. AVLTree T1,T2;
  42. T1=T->Right;
  43. T2=T1->Left;
  44. T->Right=NULL;
  45. T2->Left=T;
  46. T1->Left=NULL;
  47. T2->Right=T1;
  48. return T2;
  49. }
  50. AVLTree Insert(AVLTree T,int x){
  51. if(!T){
  52. AVLTree T =(AVLTree)malloc(sizeof(struct node));
  53. T->Data=x;
  54. T->Left=T->Right=NULL;
  55. return T;
  56. }else if(x>T->Data){
  57. T->Right=Insert(T->Right,x);
  58. if((High(T->Right)-High(T->Left))>=2){
  59. if(x>T->Right->Data)
  60. T=LL(T);
  61. else
  62. T=RL(T);
  63. }
  64. }else if(x<T->Data){
  65. T->Left=Insert(T->Left,x);
  66. if((High(T->Left)-High(T->Right))==2){
  67. if(x<T->Left->Data)
  68. T=RR(T);
  69. else
  70. T=LR(T);
  71. }
  72. }
  73. return T;
  74. }
  75. int main() {
  76. int n,x;
  77. AVLTree T=NULL;
  78. scanf("%d",&n);
  79. for (int i = 0; i < n; i++) {
  80. scanf("%d",&x);
  81. T=Insert(T,x);
  82. }
  83. printf("%d\n",T->Data);
  84. return 0;
  85. }

1-1 分糖果(循环线性表)

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. int n = sc.nextInt();
  6. int tangGuo = 0;
  7. int temp;
  8. int array[] = new int[n];
  9. for (int i = 0; i < n; i++) {
  10. array[i] = sc.nextInt();
  11. }
  12. while (true) {
  13. int x=0; //x用于记录数组中相同元素的个数
  14. for (int i = 0; i < n; i++) {
  15. if (array[i] % 2 != 0) {
  16. array[i]++;
  17. tangGuo++;
  18. }
  19. }
  20. for (int i = 0; i < n; i++) {
  21. array[i] = array[i] / 2;
  22. }
  23. temp = array[0]; //将第一个元素的一半赋值给临时变量
  24. for (int i = 0; i < n - 1; i++) {
  25. array[i] = array[i] + array[i + 1];
  26. }
  27. array[n - 1] = array[n - 1] + temp;
  28. for (int i = 0; i < n - 1; i++) {
  29. if (array[i] == array[i + 1])
  30. ++x;
  31. }
  32. if (x == n-1) {
  33. System.out.print(tangGuo);
  34. break;
  35. }
  36. }
  37. }
  38. }

1-2 表达式转换

  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner input = new Scanner(System.in);
  5. String str = input.nextLine();
  6. Stack<Character> stk = new Stack<Character>();
  7. Map<Character, Integer> map = new HashMap<Character, Integer>();
  8. map.put('+', 1);map.put('-', 1);map.put('*', 2);map.put('/', 2);
  9. map.put('(', 3);map.put(')', 3);
  10. int index = 0;
  11. boolean flag = true;
  12. while(index < str.length()){
  13. if((index < 1 || str.charAt(index - 1) == '(') && (str.charAt(index) == '+' || str.charAt(index) == '-') || isdigit(str.charAt(index))){
  14. if(flag) flag = false;
  15. else System.out.printf(" ");
  16. if(str.charAt(index) != '+') System.out.printf("%c", str.charAt(index));
  17. while(index + 1 < str.length() && (str.charAt(index + 1) == '.' || isdigit(str.charAt(index + 1))))
  18. System.out.printf("%c", str.charAt(++index));
  19. index++;
  20. }else{
  21. if(str.charAt(index) == '(') stk.push(str.charAt(index));
  22. else if(str.charAt(index) == ')'){
  23. while(!stk.empty() && stk.peek() != '('){
  24. System.out.printf(" %c", stk.peek());
  25. stk.pop();
  26. }
  27. stk.pop();
  28. }else{
  29. while(!stk.empty() && stk.peek() != '(' && map.get(stk.peek()) >= map.get(str.charAt(index))){
  30. System.out.printf(" %c", stk.peek());
  31. stk.pop();
  32. }
  33. stk.push(str.charAt(index));
  34. }
  35. index++;
  36. }
  37. }
  38. while(!stk.empty()){
  39. System.out.printf(" %c", stk.peek());
  40. stk.pop();
  41. }
  42. }
  43. static boolean isdigit(char s){
  44. if(s == '1' || s == '2' || s == '3' || s == '4' || s == '5' || s == '6' || s == '7'
  45. || s == '8' || s == '9' || s == '0') {
  46. return true;
  47. }
  48. return false;
  49. }
  50. }

3-1 优美的括号序列

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[1000];
  4. int main(){
  5. while(~scanf("%s",s)){
  6. int count=0;
  7. int judge=1;
  8. int i;
  9. for(i=0;i<strlen(s);i++){
  10. if(s[i]=='(')count++;
  11. else if(s[i]==')')count--;
  12. if(count<0){
  13. printf("NO\n");
  14. judge=0;
  15. break;
  16. }
  17. }
  18. if(count==0&&judge==1)printf("YES\n");
  19. else if(judge==1&&count!=0)printf("NO\n");
  20. }
  21. return 0;
  22. }

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

闽ICP备14008679号