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

 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.\n\n",s);
19             else
20                 printf("%s -- is a regular palindrome.\n\n",s);    
21         }
22         else{
23             if(j)
24                 printf("%s -- is a mirrored string.\n\n",s);
25             else
26                 printf("%s -- is not a palindrome.\n\n",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]='\0';
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]='\0';
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\n",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\n",i);
24                 break;    
25             }
26         }
27         //printf("i = %d\n",i);
28         if(i == n+1)
29             printf("0\n");
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\n",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:\n",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)\n",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] = '\0';
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('\n');
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 }

 

posted @ 2018-04-11 23:48  Reqaw  阅读(253)  评论(0编辑  收藏  举报