深搜专题

本文介绍了多个计算机科学中的经典算法问题,包括自然数拆分、字符串序号、单词搜索、图的着色、等式求解、聚会座位安排、马拦过河卒、灯的排列、选数、棋盘填数和特殊质数。每个问题都提供了详细描述、输入输出格式以及样例,适合算法学习和实践。
摘要由CSDN通过智能技术生成

1、自然数拆分问题(decompose.pas)

【问题描述】

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和

【输入格式】

待拆分的自然数n

【输出格式】

若干个数的加法式子

【输入样例】 decompose.in

7

【输出样例】 decompose.out

1+1+1+1+1+1+1

1+1+1+1+1+2

1+1+1+1+3

1+1+1+2+2

1+1+1+4

1+1+2+3

1+1+5

1+2+2+2

1+2+4

1+3+3

1+6

2+2+3

2+5

3+4

var n,k:longint;
    a:array[0..10000]of integer;


procedure search(remain:longint);
var i,j:longint;
begin
  if remain=0 then
    begin
      if k=1 then exit;
     for j:=1 to k-1 do write(a[j],'+');
     writeln(a[k]);
     exit;
    end;
  for i:=a[k] to remain do
    begin
      inc(k);
      a[k]:=i;
      search(remain-i);
      dec(k);
    end;
 end;

begin
assign(input,'decompose.in'); reset(input);
assign(output,'decompose.out'); rewrite(output);
readln(n);
a[0]:=1;
search(n);
close(input); close(output);
end.



2、字符串的序号(char.pas)

问题描述
字符串 acab 含有两个 a ,一个 b ,一个 c ,和 acab 含的字母和每个字母的个数都相等的字符串还有:aacb,baca等,因为他们也是含有两个 a ,一个 b ,一个 c 。所有满足这个性质的字符串按字典顺序排列后,acab 是第 5 个,我们就说acab 的序号是 5 .再如:ba 的序号是 2,aa 的序号是 1.编程求出给定字符串 S(长度<=100) 的序号 P(保证<=30000)注意:字符串只含小写字母。

输入:(char.in)
S
输出:(char.out)
P

样例
输入: 
acab

输出:
5


var s:string;
    num:array['a'..'z']of integer;
    long,k,j:integer;

procedure search(now:string;len:integer);
var i:char;
begin
  if len=long then
    begin
      inc(k);
      if now=s then
        begin
          writeln(k);
          close(input); close(output);
          halt;
        end;
       exit;
    end;
  for i:='a' to 'z' do
    if num[i]>0 then
      begin
       dec(num[i]);
       search(now+i,len+1);
       inc(num[i]);
      end;
end;



begin
  assign(input,'char.in'); reset(input);
  assign(output,'char.out'); rewrite(output);
  readln(s);
  fillchar(num,sizeof(num),0);
  long:=length(s);
  for j:=1 to long do inc(num[s[j]]);
  search('',0);
end.


3、单词搜索(SEARCH WORDS)

提交文件名:SEARCH.PAS

问题描述:

Wade正在做一个单词搜索游戏,他必须在一个大而混乱的大写字母表中找到所有这些单词。要寻找的单词来自各种不同的飞机名、火车名,和手机名。每次下一个字符可向八个方向搜索:上、下、左、右、左上、右上、左下、右下。

输入文件(SEARCH.IN):

第一行输入N(字母表长和宽,N≤50),接下来的N行输入字母表(大写字母)。

以下每行输入一个要查询的单词,长度不超过15且为大写字母。

输出文件(SEARCH.OUT):

如果被查询的单词能被找到,输出它的起始位置和最后位置的行列坐标;

否则输出Not found。

每一个单词最多在字母表中只出现一次。

输入输出样例:

SEARCH.IN

5

EDEEE

AISKE

ESEEE

ECEEE

EEEEE

DISC

DISK

DISP

ASSK

 

SEARCH.OUT

1,2 4,2

1,2 2,4

Not found

2,1 2,4


var dx:array[1..8]of integer=(-1,1,0,0,-1,-1,1,1);
    dy:array[1..8]of integer=(0,0,-1,1,-1,1,-1,1);
    i,j,n,len:longint;
    map:array[0..51,0..51]of char;
    visit:array[1..50,1..50]of integer;
    s:string;
    b:boolean;

procedure search(x,y,k:integer);
var h,xx,yy:integer;
begin
   if b then exit;
   if k=len+1 then
     begin
       writeln(i,',',j,' ',x,',',y);
       b:=true;
       exit;
     end;
   for h:=1 to 8 do
       begin
         xx:=x+dx[h]; yy:=y+dy[h];
         if (xx>0)and(xx<=n)and(yy>0)and(yy<=n)and(map[xx,yy]=s[k])and(visit[xx,yy]=0) then
            begin
              visit[xx,yy]:=1;
              search(xx,yy,k+1);
              visit[xx,yy]:=0;
            end;
       end;
end;




begin
  assign(input,'search.in'); reset(input);
  assign(output,'search.out'); rewrite(output);
  readln(n);
  for i:=1 to n do
    begin
     for j:=1 to n do read(map[i,j]);
     readln;
    end;
  while not eof do
    begin
      b:=false;
      fillchar(visit,sizeof(visit),0);
      readln(s);
      len:=length(s);
      for i:=1 to n do
        begin
          for j:=1 to n do
            begin
              if map[i,j]=s[1] then
                begin
                  search(i,j,2);
                  if b then break;
                end;
            end;
          if b then break;
        end;
        if not b then writeln('Not found');
    end;
  cl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值