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;
close(input); close(output);
end.
4、图的m着色问题(color.pas)
【问题描述】
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各定点着色,每个顶点着一种颜色,如果有一种着色法使G中每条边的2个着不同的颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种不同的颜色,找出所有不同的着色法。
对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。
【输入格式】
第一行有3个正整数n , k和m,(n<=100,k<=3000,m<=10)表示给定图G有n个顶点,k条边,m中颜色,顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u , v,表示图G的一条边(u,v)。
【输出格式】
计算出的不同的着色方案数
【输入样例】 color.in
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
【输出样例】 color.out
48
这题一开始T了,去掉初始化就过了= =
var n,k,m,i,u,v:longint;
map:array[1..100,1..100]of integer;
color:array[1..1000]of integer;
ans:longint;
procedure search(now:integer);
var j,s,t:integer;
b:boolean;
begin
if now>n then
begin
inc(ans);
exit;
end;
for j:=1 to m do
begin
b:=true;
for s:=1 to now-1 do
if (map[now,s]=1)and(j=color[s]) then
begin
b:=false; break;
end;
if b then
begin
color[now]:=j;
search(now+1);
end;
end;
end;
begin
assign(input,'color.in'); reset(input);
assign(output,'color.out'); rewrite(output);
readln(n,k,m);
for i:=1 to k do
begin
readln(u,v);
map[u,v]:=1;
map[v,u]:=1;
end;
ans:=0;
search(1);
writeln(ans);
close(input); close(output);
end.
5、等式问题(b.pas/c/cpp)
问题描述
有一个未完成的等式:1 2 3 4 5 6 7 8 9=N 空格(1前面没有空格)内可以填入+,-,也可以不填。 编程找出输入某个整数 N 后使等式成立的所有方案的总数。保证有解。
样例
输入:(b.in)
108
输出:(b.out)
15
【分析】注意处理不填的情况,多传送一个参数,第一步要特殊处理
#include <cstdio>
using namespace std;
int n,ans=0;
void Search(int p,int s)
{
if (p==10)
{
if (s==n)
{
ans++;
return;
}
}
for (int i=p;i<=9;i++)
{
int tot=0;
for (int j=p;j<=i;j++)
tot=tot*10+j;
Search(i+1,s+tot);
Search(i+1,s-tot);
}
}
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
scanf("%d",&n);
for (int k=1;k<=9;k++)
{
int tott=0;
for (int kk=1;kk<=k;kk++)
tott=tott*10+kk;
Search(k+1,tott);
}
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}
6、Party
(party.pas/c/cpp)
描述Description
Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多少种安排方法。
输入格式Input Format
输入两个用空格隔开的数N和K,其中1<=N<=10,1<=K<=1000 000。接下来输入每个人的身高值。所有人的身高都是不超过1 000 000的正整数
输出格式Output Format
输出符合要求的安排总数
样例输入Sample Input (party.in)
4 10 2 16 6 10
样例输出 Sample Output(party.out)
2
【分析】由于是坐成环形,按相对位置来处理,假定第一个人不动
各种傻逼错误wa了= = 没开Longint 和读入多打了Ln
var n,k,i,j,ans:longint;
t:array[0..10]of longint;
mark:array[1..10]of boolean;
sum:integer;
function check(x,y:integer):boolean;
begin
if abs(t[x]-t[y])>k then exit(false);
if (sum=n-1) and(abs(t[y]-t[1])>k) then exit(false);
exit(true);
end;
procedure search(x:integer);
var c:integer;
begin
if sum=n then
begin
inc(ans);
exit;
end;
for c:=1 to n do
if mark[c] then
if check(x,c) then
begin
mark[c]:=false;
inc(sum);
search(c);
mark[c]:=true;
dec(sum);
end;
end;
begin
assign(input,'party.in'); reset(input);
assign(output,'party.out'); rewrite(output);
read(n,k);
for i:=1 to n do read(t[i]);
ans:=0;
fillchar(mark,sizeof(mark),true);
mark[1]:=false;
sum:=1;
search(1);
writeln(ans);
close(input); close(output);
end.
7 、马拦过河卒
源程序名 knight.???(pas, c, cpp) 可执行文件名 knight.exe 输入文件名 knight.in 输出文件名 knight.out |
【问题描述】
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
【输入】
一行四个数据,分别表示B点坐标和马的坐标。
【输出】
一个数据,表示所有的路径条数。
【样例】
knight.in knight.out
6 6 3 3 6
【分析】
8、灯(deng.pas)
灯的排列问题:设在一排上有N个格子(N<=20),在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,…Np(p表示不同颜色灯的个数)。
放灯时要遵守下列规则:
①同一种颜色的灯不能分开;
②不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数)
R=2(红灯数)
B=3(蓝灯数)
放置的方法有:
R-B顺序
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
B-R顺序
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
B |
B |
B |
R |
R |
放置的方式为12种。
数据输入的方式为:
N
P1(颜色,为第一个字母) N1(灯的数量)
P2 N2
……
Q(结束标记,Q本身不是灯的颜色)
程序要求:求出一种顺序的排列方案及排列总数。(例如只输出R_B或B-R)
样例输入:(deng.in)
2
R 1
Q
样例输出:(deng.out)
R_
_R
2
程序要求:求出一种顺序的排列方案及排列总数。
分析:本题对彩灯的排列作了两个限制:
同一种颜色的灯不能分开:
这一条件的约束,使得灯的数量失去了实质的意义。因为我们可以将连续的相同颜色的灯就看作一盏灯。因此,我们只需考虑每种颜色一盏灯的情况。
9、选数 (num.pas)
[问题描述]:
已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29)。
[输入]:(num.in)
键盘输入,格式为:
n , k (1<=n<=20,k<n=
x1,x2,…,xn (1<=xi<=5000000)
[输出]:(num.out)
屏幕输出,格式为:
一个整数(满足条件的种数)。
[输入输出样例]:
输入:
4 3
3 7 12 19
输出:
1
10、棋盘(qipan.pas)
在N*N的棋盘上(1<=N<=10)填入1,2,...N*N共N*N个数,使得任意两个相邻的数之和为素数. 例如,当N=2时,有
1 |
2 |
4 |
3 |
其相邻数的和为素数的有:1+2,1+4,4+3,2+3
当N=4时,一种可以填写的方案如下:(n=4有二种方案,均可)
1 |
2 |
11 |
12 |
16 |
15 |
8 |
5 |
13 |
4 |
9 |
14 |
6 |
7 |
10 |
3 |
在这里我们约定:左上角的格子里必须放数字1
程序要求:
输入:N(qipan.in)
输出:若有多种解,则需输出第一行,第一列之和均为最小的排列方案;若无解,则输出"NO!"(qipan.out)(每个数字场宽为4)
例:
输入:4
输出:
1 2 11 12
4 9 8 5
7 10 3 14
6 13 16 15
11、数的划分(numf.pas)
问题描述
将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入:n,k (6<n<=200,2<=k<=6)
输出:一个整数,即不同的分法。
样例
输入: 7 3(numf.in)
输出:4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}(numf.out)
12、单词接龙 (wordlong.pas)
问题描述:
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们己知一组单词,且
给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙" 中
出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果
接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间
不能相连。
输入:
输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输
入的最后一行为一个单个字符,表来“龙”开头的字母。你可以假定以此字母开头的“龙"
一定存在。
输出: 只需输出以此字母开头的最长的“龙”的长度
样例:
输入(wordlong.in)
5
at
touch
cheat
choose
tact
a
输出(wordlong.out)
23
13、Hamming codes海明码
给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming距离”(1 <= D <= 7)。“Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234(0x554和0x234分别表示两个十六进制数):
0x554 = 0101 0101 0100
0x234 = 0010 0011 0100
不同位 xxx xx
因为有五个位不同,所以“Hamming距离”是 5。
格式
PROGRAM NAME: hamming
INPUT FORMAT:
(file hamming.in)
一行,包括 N, B, D。
OUTPUT FORMAT:
(file hamming.out)
N 个编码(用十进制表示),要排序,十个一行。如果有多解,你的程序要输出这样的解:假如把它化为2进制数,它的值要最小。
SAMPLE INPUT
16 7 3
SAMPLE OUTPUT
0 7 25 30 42 45 51 52 75 76
82 85 97 102 120 127
提示
必须与其他所有的数相比,Hamming距离都符合要求,这个数才正确 什么意思啊??? 答:如样例输出,0和7,0和25,0和……比较都符合海明码,同样7和25,7和30,7和……比较也符合要求,以此类推。 就这样了。
分析
我们只要按递增顺序搜索要求的n个数,然后跟前面的数判断距离是否大于d,在找到一组解后它肯定是最小的,输出。 数据不大,暴力搜索即可。注意:
0是必须出现的。
几个优化:
1. b给出了搜索的最大值:2^b-1(这条好像不是优化)
2. 计算两个数a,b的距离,只要计算a xor b的数的二进制形式中1的个数。
14、特殊的质数肋骨
农民约翰母牛总是产生最好的肋骨。
你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。
农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说:
7 3 3 1
全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。
7331 被叫做长度 4 的特殊质数。
写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数。
数字1不被看作一个质数。
PROGRAM NAME: sprime
INPUT FORMAT
单独的一行包含N。
SAMPLE INPUT (file sprime.in)
4
OUTPUT FORMAT
按顺序输出长度为 N 的特殊质数,每行一个。
SAMPLE OUTPUT(file sprime.out)
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
15、汽车的最终位置(search1.pas)
[问题描述]
年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。
那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。
编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。
小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。
汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。
拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。
[输入文件]search1.in。
输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。
以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。
接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。
接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。
[输出文件]search1.out.
输出文件应包含用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。
[输入输出样例]
Input.txt
4 5
.....
.X...
...*X
X.X..
3
NORTH
WEST
SOUTH
Output.txt
.....
*X*..
*.*.X
X.X..
The Castle
城堡
以一个几乎超乎想像的运气,农民约翰在他的生日收到了一张爱尔兰博彩的奖券。
这一张奖券成为了唯一中奖的奖券。
农民约翰嬴得爱尔兰的乡下地方的一个传说中的城堡。
吹牛在他们威斯康辛州不算什么,农民约翰想告诉他的牛所有有关城堡的事。
他想知道城堡有多少房间,而且最大的房间有多大。
事实上,他想去掉一面墙来制造一个更大的房间。
你的任务是帮助农民约翰去了解正确房间数目和大小。
城堡的平面图被分为 M(wide)*N(1 <=M,N<=50)个小正方形。
每个这样的小正方形有0到4面墙。
城堡在它的外部边缘总是有墙壁的,好遮挡风雨。
考虑这注解了一个城堡的平面图:
1 2 3 4 5 6 7
#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # -># | | | | # #
#############################
# =墙壁 -, | = 没有墙壁
-> =移除这面墙能使得到的新房间最大
例子的城堡的大小是7 x 4。
一个 "房间"是平面图上有连接的"小正方形"的集合。
这个平面图包含五个房间。(它们的大小是9,7,3,1, 和 8 排列没有特别的顺序)。
移除被箭作记号的墙壁来合并两个房间来制造最大的可能房间(移除一面墙所能产生的)。
城堡总是至少有二个房间并且总是有一面墙壁以可能被移除。
PROGRAM NAME: castle
INPUT FORMAT
地图以一个表格来储存,每个数字描述一个小正方形,N行每行M个数来描述这个平面图。
输入顺序符合那个在上面例子的编号方式。
每个描述小正方形的数字说明小正方形的四面的墙的分布情况,它是下面4个数的和:
1: 在西面有墙
2: 在北面有墙
4: 在东面有墙
8: 在南面有墙
内部的墙壁是会被定义两次;小正方形(1,1)南面的墙也被指出是小正方形(2,1)北面的墙。
第 1 行: |
二个被空格分开的整数: M 和 N |
第 2 到 N+1 行: |
M x N 个整数,每行M个。 |
SAMPLE INPUT (file castle.in)
7 4
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
OUTPUT FORMAT
输出包含一些行:
第 1 行: |
城堡的房间数目。 |
第 2 行: |
最大的房间的大小 |
第 3 行: |
移除一面墙能得到的最大的房间的大小 |
第 4 行: |
移除哪面墙 |
选择最佳的墙来移除,(选择最靠西的,如果仍然不能确定,再选择最靠南的。编者注:墙的位置应该由它的中点来定义)
(【原文】Choose the optimal wall to remove from the set ofoptimal walls by choosing the wall farther to the west (and then, if stilltied, farthest to the south).)
墙壁由它在相邻的小正方形的西部或南方来命名
SAMPLE OUTPUT (filecastle.out)
5
9
16
4 1 E