回 帖 发 新 帖 刷新版面

主题:十万火急求解!!!

1.    单词接龙(word)
小雪在学习英文的过程中发现,许多单词的结尾部分恰好是另外一些单词的开头部分,如:choice和certain,那么这两个单词就可以连接起来,变成:choicertain。小雪觉得这非常有意思,于是她设计了一个单词接龙的游戏,即:给出一组单词,且给定一个开头的字母,算出以这个字母开头的最长的“龙”(每个单词在“龙”中最多只出现一次)。在两个单词相连时,其重合部分合为一部分,另外,必须要首尾连接,例如attent 和 atide 间不能相连。现在小雪邀请你一起玩这个单词接龙的游戏,聪明的你能不能战胜小雪呢?
输入:输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有 一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。假定以此字母开头的“龙”一定存在,但“龙”并不一定包括所有单词。 
输出:只需输出以此字母开头的最长的“龙”的长度。
样例:
    输入(word.in):
     3
     at
     touch
     cheat
     like
     a         
输出(word.out):
       9    (连成的“龙”为atoucheat)
2.    数的划分(split)
数学课上,老师给大家出了一个问题,给定一个整数n,将它分成k份,那么有多少种不同的分法?老师又设立了一些规则,即:每份不能为空,并且任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的:
1,1,5;
1,5,1;
5,1,1;
现在,老师给出一组整数,让大家按要求来分解,做的最快的同学可以获得奖励,小雪很想赢,你能帮助她吗?

输入:n,k (6<n<=200,2<=k<=6,n和k之间用一个空格隔开)。
输出:一个整数,即不同的分法。
样例:
输入(split.in):
     7 3
输出(split.out):
4 {四种分法为:1,1,5;   1,2,4;   1,3,3;   2,2,3;}
3.    身份证数目统计(count)
AHHF研究所是世界顶级研究所之一。为了防止最新成果泄露,研究所所长决定给每个人发放一张个人身份证,每个身份证都是由19位数字组成的,形式是:
DDMMYYYYAAAAAAAAAAC
前8位数字表示了持有人的生日,DD为日,MM为月,YYYY为年。在这里,我们认为出生年份是一个0001到9999之间的正整数。
字母A表示的位置可以是任意的数字(0-9),C是由如下算法得到的控制数字:
1、用Z1…Z18表示身份证中前18位数字
2、S = 
(10*Z1+9*Z2+8*Z3+…+2*Z9+10*Z10+9*Z11+8*Z12+…+2*Z18) mod 19
3、如果S≤9那么C = S,否则C = 19-S
前几天,保安们从一名来历不明的入侵者身上搜到了一张身份证,不料身份证上已有多处已经残缺之处,看不清了,我们用X表示。现在的问题是,计算有多少种可能的身份证与得到的身份证相符合?这对下一步调查工作非常重要!所长将这份工作交给了小雪,你能帮助小雪解决这个难题嘛?

输入:仅包含一行,按照上面给出的格式描述了得到的身份证。
输出:包含一个数字,表示所有可能的满足条件的身份证的个数。我们保证这个数目不会超过64位有符号整数能够表示的范围
样例:
输入(count.in):
XX0220051234567890X 
输出(count.out):
28

半小时内发布源程序一题加30分!
一小时内发布源程序一题加10分!

回复列表 (共2个回复)

沙发

{数的划分}
Program huafen;
  var n,k,c:longint;
  Procedure search(depth,left,last:integer);
    var i:integer;
    begin
      if depth=2 then c:=c+left div 2-last+1
      else
      for i:=last to left div depth do
        search(depth-1,left-i,i);
    end;
  Begin
    readln(n,k); c:=0;
    search(k,n,1);
    writeln(c);
  End.
深搜里有讲这个的,慢慢领悟!

板凳

var
 s:string;
 a:array[1..20,1..2]of char;  //存放每个词的开头和结尾字母
 b:array[1..20]of integer;  //存放相应词的长度
 p:array[1..20]of boolean;  //存放这个词是否用过
 c:char;                   //存放当前结尾字母~
 n,i,sum1,sum:integer;
 procedure dfs(k:char);
  begin
   for i:=1 to n do
    if (p[i])and (a[i,1]=k) then
     begin
      inc(sum1);
      k:=a[i,1];
      p[i]:=false;
      dfs(a[i,2]);
      if sum1>sum then sum:=sum1;
      dec(sum1);
      p[i]:=true;
     end;
  end;
begin
 readln(n);
 fillchar(p,sizeof(p),true);
 sum:=0;
 sum1:=0;
 for i=1 to n do
  begin
   readln(s);
   b[i]:=length(s);
   a[i,1]:=s[1];
   a[i,2]:=s[b[i]];
  end;
 readln(c);
 dfs(c);
 writeln(sum);
end.   
第一个题的答案~随手编的,没经调试~没经优化~呵呵,抱歉啊~递归可能有点问题~

我来回复

您尚未登录,请登录后再回复。点此登录或注册