bnuoj 字符串6题

题目链接:http://www.bnuoj.com/v3/contest_show.php?cid=6188#problem/A

A:水题。题意很清楚。

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 char s[10000];
 6 int main()
 7 {
 8     int t;
 9     scanf ("%d",&t);
10     while (t--)
11     {
12         scanf ("%s",s);
13         int sum=0;
14         int i,j,k=0;
15         for(i=0;i<strlen(s);i++)
16         {
17             if(s[i]=='O')
18             {
19                 sum+=k+1;
20                 k++;
21             }
22             else
23                 k=0;
24         }
25         printf("%d\n",sum);
26     }
27     return 0;
28 }

B:Molar mass

大致题意:计算给出分子式的相对分子质量。重点是对字符串的处理。

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 char s[1000];
 7 int main()
 8 {
 9     int t;
10     scanf ("%d",&t);
11     while (t--)
12     {
13         double sum=0;
14         scanf ("%s",s);
15         int len=strlen(s);
16         if(len==1)//这里对只有一个元素的分子式的一个小处理。
17         {
18             strcat(s,"1");
19             len++;
20         }
21         //printf("%s\n",s);
22         for(int i=0;i<=len;)
23         {
24             int x=0;
25             int j=i+1;
26             while (s[j]<='9'&&s[j]>='0')
27             {
28                 x=x*10+s[j]-'0';
29                 j++;
30             }//找到所含原子的个数。
31             if(j==i+1)如果j的值并为改变,说明该原子数量为1.
32                 x=1;
33             if(s[i]=='C')
34                 sum+=x*12.01;
35             else if(s[i]=='H')
36                 sum+=x*1.008;
37             else if(s[i]=='N')
38                 sum+=x*14.01;
39             else if(s[i]=='O')
40                 sum+=x*16.00;
41             i=j;
42         }
43         printf("%.3lf\n",sum);
44     }
45     return 0;
46 }

C:Digit Counting

大致题意:计算1~n这些数里0~9这10个数字出现的次数。水水水!

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 int main()
 4 {
 5     int t;
 6     scanf ("%d",&t);
 7     while (t--)
 8     {
 9         int a[10];
10         memset(a,0,sizeof(a));
11         int n;
12         scanf ("%d",&n);
13         for(int i=1;i<=n;i++)
14         {
15             int temp=i;
16             while (temp)
17             {
18                 a[temp%10]++;
19                 temp/=10;
20             }
21         }
22         for(int i=0;i<10;i++)
23             printf("%d ",a[i]);
24         printf("\n");
25     }
26     return 0;
27 }

D:periodic strings

大致题意:一个字符串又多个循环节组成。我们需要做的是找出里面长度最小的循环节并输出。

我用的是kmp算法。其实这么小的数据量枚举就可以处理。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 char s[10000];
 7 int next[10000];
 8 void getnext()
 9 {
10     next[0]=-1;
11     int k=-1,j=0;
12     int len=strlen(s);
13     while (j<len)
14     {
15         if(k==-1||s[j]==s[k])
16         {
17             j++;
18             k++;
19             if(s[j]!=s[k])
20             next[j]=k;
21             else
22                 next[j]=next[k];
23         }
24         else
25             k=next[k];
26     }
27 }
28 int main()
29 {
30     int t;
31     scanf ("%d",&t);
32     while(t--)
33     {
34         scanf ("%s",s);
35         memset(next,0,sizeof(next));
36         getnext();
37         int len=strlen(s);
38         if(len%(len-next[len])==0)
39             printf("%d\n",len-next[len]);
40         else
41             printf("%d\n",len);
42         if(t)
43             printf("\n");
44     }
45     return 0;
46 }

E:Puzzle 

大致题意:一个5X5的矩阵,里面放了24个字母和一个空格。现在对这个空格有交换A上B下L左R右四种操作。

             现在给出这样的矩阵和若干操作,打印出操作后的矩阵。

            这题难度在于字符的读入与读出。真的好麻烦。代码没有A,不过样例过了,以后更新。

代码如下:

  1 #include <cstdio>
  2 #include <cstring>
  3 
  4 char s[100][100];
  5 int x,y,temp;
  6 int ok(int xx,int yy)
  7 {
  8     if(xx<5&&xx>=0&&yy<5&&yy>=0)
  9         return 1;
 10     else
 11         return 0;
 12 }
 13 void change(int xx,int yy,char c)//改变字符的操作。。
 14 {
 15     if(c=='A')
 16     {
 17         if(ok(xx-1,yy))
 18         {
 19             s[xx][yy]=s[xx-1][yy];
 20             x=xx-1;
 21         }else
 22         {
 23             temp=1;
 24             return ;
 25         }
 26     }else if(c=='R')
 27     {
 28         if(ok(xx,yy+1))
 29         {
 30             s[xx][yy]=s[xx][yy+1];
 31             y=yy+1;
 32         }else
 33         {
 34             temp=1;
 35             return ;
 36         }
 37     }else if(c=='B')
 38     {
 39         if(ok(xx+1,yy))
 40         {
 41             s[xx][yy]=s[xx+1][yy];
 42             x=xx+1;
 43         }else
 44         {
 45             temp=1;
 46             return ;
 47         }
 48     }else if(c=='L')
 49     {
 50         if(ok(xx,yy-1))
 51         {
 52             s[xx][yy]=s[xx][yy-1];
 53             y=yy-1;
 54         }else
 55         {
 56             temp=1;
 57             return ;
 58         }
 59     }
 60 }
 61 int main()
 62 {
 63     int t=0;
 64     while (1)
 65     {
 66         int num=0;
 67         for(int i=0;i<5;i++)
 68         {
 69             gets(s[i]);
 70             if(strlen(s[i])==1)
 71             {
 72                 num=1;
 73                 break;
 74             }
 75         }
 76         if(num)//读入一个字符Z的时候结束程序。
 77             break;
 78         for(int i=0;i<5;i++)
 79         {
 80             int flag=0;
 81             for(int j=0;j<5;j++)
 82             {
 83                 if(s[i][j]==' ')
 84                 {
 85                     x=i,y=j;
 86                     flag=1;
 87                     break;
 88                 }
 89             }
 90             if(flag)
 91                 break;
 92         }//找到属于空格的坐标。
 93         //printf("%d %d\n",x,y);
 94         char c;
 95         temp=0;
 96         while (1)
 97         {
 98             scanf ("%c",&c);
 99             if(c=='0')
100                 break;
101             if(c=='\n')
102                 continue;
103             change(x,y,c);//读入对空格的操作。因为操作可能有两行。所以需要处理。
104         }
105         printf("Puzzle #%d:\n",++t);//实例的个数
106         s[x][y]=' ';
107         if(temp==0)
108             for(int i=0;i<5;i++)
109             {
110                 for(int j=0;j<5;j++)
111                 {
112                     if(j==4)
113                         printf("%c",s[i][j]);
114                     else
115                         printf("%c ",s[i][j]);
116                 }
117                 printf("\n");
118             }
119         else
120             printf("This puzzle has no final configuration.\n");
121         printf("\n");
122         gets(s[0]);//这里其实我也有疑问??不过为什么必须在循环结束读入s[0].如果有大神看到,求告知。日后修改A了的代码。
123     }
124     return 0;
125 }

F:Crossword Answered

大致题意:这题就是一个坑的填字游戏!!!!

没有写

posted on 2015-04-21 19:19  Bei_insomia  阅读(150)  评论(0编辑  收藏  举报

导航