• 算法入门经典(第二版)第三章例题一览


     1 /*
     2 问题 根据键盘的位置向右错一位输出,其中不会出现QAZ等字符
     3 解题思路 建立一个字符串常量,注意回车左边为一个',和存储的时候要写两个否则编译器不识别 
     4 */
     5 #include<cstdio>
     6 #include<cstring>
     7 int main()
     8 {
     9     char list[]="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
    10     char ch,*p = NULL;
    11     while((ch = getchar()) != EOF){
    12         p = strchr(list,ch);
    13         if(p != NULL){
    14             printf("%c",*(p-1));
    15         }
    16         else
    17             printf("%c",ch);
    18     }
    19     return 0;    
    20 } 
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<map>
     4 using namespace std;
     5 
     6 int ishuiwen(char *s);
     7 int isjingxiang(char *s);
     8 
     9 int main()
    10 {
    11     char s[30],h,j;
    12     while(scanf("%s",s) != EOF){
    13         h=ishuiwen(s);
    14         j=isjingxiang(s);
    15         
    16         if(h){//分清逻辑关系 
    17             if(j)
    18                 printf("%s -- is a mirrored palindrome.
    
    ",s);
    19             else
    20                 printf("%s -- is a regular palindrome.
    
    ",s);    
    21         }
    22         else{
    23             if(j)
    24                 printf("%s -- is a mirrored string.
    
    ",s);
    25             else
    26                 printf("%s -- is not a palindrome.
    
    ",s);
    27         }    
    28     }
    29     return 0;    
    30 }
    31 
    32 
    33 int ishuiwen(char *s){
    34     char str[30];
    35     int len=strlen(s),i,j=0;
    36     for(i=len-1;i>=0;i--){
    37         str[j++]=s[i];
    38     }
    39     str[j]='';
    40     
    41     if(strcmp(s,str) == 0)
    42         return 1;
    43     else     
    44         return 0;
    45 } 
    46 
    47 int isjingxiang(char *s)
    48 {
    49     map<char,char> m;
    50     m['A']='A';
    51     m['E']='3';
    52     m['H']='H';
    53     m['I']='I';
    54     m['J']='L';
    55     m['L']='J';
    56     
    57     m['M']='M';
    58     m['O']='O';// O O 
    59     m['S']='2';
    60     m['T']='T';
    61     m['U']='U';
    62     m['V']='V';
    63     m['W']='W';
    64     m['X']='X';
    65     m['Y']='Y';
    66     
    67     m['Z']='5';
    68     
    69     m['1']='1';
    70     m['2']='S';
    71     m['3']='E';
    72     m['5']='Z';
    73     m['8']='8';
    74     
    75     char str[30];
    76     
    77     int len=strlen(s),i,j=0;
    78     for(i=len-1;i>=0;i--){
    79         str[j++]=s[i];
    80     }
    81     str[j]='';
    82     
    83     for(i = 0; i < len; i++){
    84         if(m[ s[i] ] != str[i])
    85             return 0;
    86     }
    87     return 1;
    88 }
     1 /*
     2 问题 输入n,计算并输出最小生成元
     3 解题思路 将1到100000的数字对应的生成元计算出来,查表即可 
     4 */
     5 #include<cstdio>
     6 
     7 int scy(int n);
     8 int m[100100];
     9 int main()
    10 {
    11     int t,n,i;
    12     for(i=1;i<=100000;i++){
    13         m[i]=scy(i);
    14         //printf("%d %d
    ",i,m[i]);
    15     }
    16     
    17     scanf("%d",&t);
    18     while( t-- )
    19     {
    20         scanf("%d",&n);
    21         for(i=1;i<=n;i++){
    22             if(n == m[i]){
    23                 printf("%d
    ",i);
    24                 break;    
    25             }
    26         }
    27         //printf("i = %d
    ",i);
    28         if(i == n+1)
    29             printf("0
    ");
    30     }
    31     return 0;
    32 }
    33 
    34 int scy(int n)
    35 {
    36     int x=n,sum=n;
    37     while(x){
    38         sum += x%10;
    39         x /= 10;
    40     }    
    41     //printf("sum = %d
    ",sum);
    42     return sum;
    43 } 
     1 /*
     2 问题 输入n(n<=1000),和n个数字表示密码串,再输入若干行猜测串,计算并输出有多少个数字位置正确,有多少个数字在两个序列
     3 中都出现过但是位置不对。
     4 解题思路 模拟,比较两个串,如果对应位置相等a++并标记匹配过,否则拿该数字在整个密码串中寻找,找到b++。 
     5 */
     6 #include<cstdio>
     7 #include<cstring>
     8 const int N=1010;
     9 
    10 int myfind(int x,int s[],int n,int book[]);
    11 int main()
    12 {
    13     int n,s1[N],s2[N],book[N],i,a,b,t=1,j,sum;
    14     while(scanf("%d",&n) == 1 && n){
    15         printf("Game %d:
    ",t++);//PE 4遍,格式问题,放在该次游戏输入数据之前 
    16         for(i=0;i<n;i++)
    17             scanf("%d",&s1[i]);
    18             
    19         while(1){
    20             sum=0;
    21             for(i=0;i<n;i++){
    22                 scanf("%d",&s2[i]);
    23                 sum += s2[i];
    24             }
    25             if(sum == 0)    break;
    26             
    27             memset(book,0,sizeof(int)*N);//标记s1中能与s2对应位置正确的为1    
    28             a=b=0;
    29             for(i=0;i<n;i++){
    30                 if(s1[i] == s2[i]){
    31                     a++;
    32                     book[i]=1;
    33                     s2[i]=-1;//匹配正确的不再寻找 
    34                 }    
    35             }
    36             for(i=0;i<n;i++){
    37                 if(s2[i] != -1 && myfind(s2[i],s1,n,book))//没有匹配正确而且能在s1中找到 
    38                 {
    39                     b++;
    40                 }
    41             }
    42             printf("    (%d,%d)
    ",a,b);
    43         }
    44     }
    45     return 0;    
    46 } 
    47 
    48 int myfind(int x,int s[],int n,int book[])
    49 {
    50     int i;
    51     for(i=0;i<n;i++){
    52         if(book[i] == 0 && x == s[i]){//x在s1中没有被匹配过 
    53             book[i]=1;//被匹配过 
    54             return 1;
    55         }
    56     }
    57     return 0;
    58 }
     1 /*
     2 问题 输入一个环状序列,输出该环状序列的最小表示
     3 解题思路 自己的解法,将原串赋值两遍,找出所有序列存入set集合容器,最后输出首位即可。
     4 算法入门经典提供的思路,充分利用模运算,由于长度一定是相等的,所以一位一位比较,小于是更新位置,最后输出即可
     5 相比较而言,后者当数据量比较大的时候时间和空间复杂度相对低一点。 
     6 */ 
     7 /*set集合容器解法 
     8 #include<cstdio>
     9 #include<cstring>
    10 #include<iostream>
    11 #include<string>
    12 #include<set>
    13 using namespace std;
    14 
    15 int main()
    16 {
    17     int t,i,len,j,k;
    18     string s1;
    19     set<string> s;
    20     
    21     char str1[110],str2[230],str[110];
    22     scanf("%d", &t);
    23     while(t--){
    24         scanf("%s",str1);
    25         strcpy(str2,str1);
    26         strcat(str2,str1);
    27         
    28         len=strlen(str1);
    29         for(i=0;i < len;i++){
    30             
    31             k=0;
    32             for(j=i;j < i+len;j++)
    33                 str[k++]=str2[j];
    34             str[k] = '';
    35             
    36             s1=str;
    37             s.insert(s1);
    38         }
    39         cout<<(*(s.begin()))<<endl;
    40         s.clear();
    41     }
    42     return 0;
    43 }*/
    44 //算法入门经典标程 
    45 #include<cstdio>
    46 #include<cstring>
    47 #include<iostream>
    48 #include<string>
    49 #include<set>
    50 using namespace std;
    51 
    52 int less2(char s[],int p,int ans);
    53 int main()
    54 {
    55     int t,i,len,j,k,ans;
    56 
    57     char str[110];
    58     scanf("%d", &t);
    59     while(t--){
    60         scanf("%s",str);
    61         len=strlen(str);
    62         ans=0;
    63         for(i=1;i < len;i++)
    64             if( less2(str,i,ans) ) ans=i;    
    65         for(i=0;i<len;i++)
    66             printf("%c",str[(ans+i)%len]);
    67         putchar('
    ');
    68     }
    69     return 0;
    70 }
    71 int less2(char s[],int p,int ans)
    72 {
    73     int len=strlen(s);
    74     int i;
    75     for(i=0;i<len;i++){
    76         if(s[(p+i)%len] != s[(ans+i)%len])
    77             return s[(p+i)%len] < s[(ans+i)%len];
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    UIProgressView的详细使用
    Android拍照上传代码样例
    UILabel的详细使用及特殊效果
    TextView属性android:ellipsize实现跑马灯效果
    Android中WebView实现Javascript调用Java类方法
    有效获取状态栏(StatusBar)高度
    详解iPhone Tableview分批显示数据
    TextView显示插入的图片
    ObjectiveC语法快速参考
    UISegmentedControl的详细使用
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8799572.html
Copyright © 2020-2023  润新知