过河卒,24点 pascal语言程序。(我是初学者写的易懂点 能省过程、函数尽量省)

过河卒:问题描述】棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马... 过河卒:
问题描述】
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0,0)、B点(n,m)(其中:n,m为不超过15的数),同样马的位置坐标是需要给出的。
任务:现在要求你编写一个程序来计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

【输入格式】
输入文件中仅一行为四个整数,分别表示B点坐标和马的坐标。

【输出格式】
输出文件中仅一行为一个整数,表示所有的路径条数。

【输入输出样例】
输入:
6 6 3 3

输出:
6
24点:
【问题描述】
几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲。在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。
您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子:
若给出的四个操作数是:1、2、3、7,则一种可能的解答是:1+2+3*7=24。

【输入格式】
输入文件中仅一行为四个1到9之间的自然数。

【输出格式】
如果有解的话,只需要输出一个解。输出的是三行数据,分别表示运算的步骤。其中:第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果;第三行是第二行的结果和输入的一个数、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
如果没有解,则输出“No answer!”

【输入输出样例】
输入:
1 2 3 7

输出:
2+1=3
7*3=21
21+3=24
最好告诉我算法简述。。。我加分
展开
 我来答
zhangwen1994
2012-07-27 · TA获得超过358个赞
知道小有建树答主
回答量:153
采纳率:0%
帮助的人:173万
展开全部
program E1_1; {knight}
const
dx:array[1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
dy:array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1);
这个就是传说中的增量矩阵。其实也没那么神秘,就是一张表,有8种变化状态,每种状态对应了一个delta
x和y,比如第一种变化,x坐标减小2,y坐标加1。表示在棋盘上的8种行走方式。
var
n,m,x,y,i,j: byte;
g:array[0..20,0..20] of 0..1;
c:longint;
infile,outfile:text;
//这边是关键步骤
procedure sol(x,y:integer);
var i:integer;
begin
if (x=n) and (y=m) then c:=c+1(当前x,y坐标都为目标坐标,那么总路径c +1,c为统计的路径条数) else
begin//深搜,只有2个法则,向上y+1,向左x+1。并且判断有没有出界。
if (y<m) and (g[x,y+1]=0) then sol(x,y+1);
if (x<n) and (g[x+1,y]=0) then sol(x+1,y);
end;
end;

begin
assign(infile,'knight.in');
assign(outfile,'knight.out');
reset(infile);
readln(infile,n,m,x,y);
close(infile);

g[x,y] := 1;
for i:=1 to 8 do
if (x+dx[i]>=0) and (x+dx[i]<=n) and (y+dy[i]>=0) and (y+dy[i]<=m) then
g[x+dx[i],y+dy[i]]:=1;//给地图赋值,0为可走,1为被马控制,如g[1,1]=1说明坐标(1,1)点被控制了。
sol(0,0);//从坐标(0,0)开始走。

rewrite(outfile);
writeln(outfile,c);
close(outfile);
end.
/----------------------------------------------------/
type arr=array [1..4] of integer;
var i,result,n,len:integer;
d:arr;
r:array [1..3,1..4] of integer;
procedure print; //打答案用的,r[i,1],r[i,3]为运算数字,r[i,2]为运算符,r[i,4]为答案
var i,j:integer;
begin
assign(output,'point.out'); rewrite(output);
for i:=1 to 3 do
begin
for j:=1 to 3 do
if j<>2 then write(r[i,j])
else case r[i,j] of
1:write('+');
2:write('-');
3:write('*');
4:write('/')
end;
writeln('=',r[i,4])
end;
close(output);
end;
procedure try(k:integer;var d:arr); //枚举,d数组暂存结果
var a,b,i,j,l,t:integer;
e:arr;
begin
if k=1 then
if d[1]=24 then begin print;halt end
else
else begin
for i:=1 to k-1 do
for j:=i+1 to k do
begin
a:=d[i]; b:=d[j]; //枚举要用的两个数
if a<b then begin t:=a;a:=b;b:=t end;
t:=0;
for l:=1 to k do if (l<>i) and (l<>j) then begin t:=t+1;e[t]:=d[l] end; //将剩下的数放好
r[5-k,1]:=a;
r[5-k,3]:=b;
r[5-k,4]:=-1;
for l:=1 to 4 do //枚举运算符
begin
case l of
1:r[5-k,4]:=a+b;
2:r[5-k,4]:=a-b;
3:r[5-k,4]:=a*b;
4:if b<>0 then if a mod b=0 then r[5-k,4]:=a div b
end;
r[5-k,2]:=l;
if r[5-k,4]<>-1 then
begin
e[t+1]:=r[5-k,4];
try(k-1,e)
end
end
end
end;
end;
begin
assign(input,'point.in');reset(input);
for i:=1 to 4 do read(d[i]);
close(input);
try(4,d);
assign(output,'point.out');rewrite(output);
writeln('No answer!');
close(output);
end.
追问
分别用的什么算法
追答
第一个深搜 第二个枚举
aipaichenmo
2012-07-27
知道答主
回答量:10
采纳率:0%
帮助的人:1.6万
展开全部
碟子
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式