【中级擂台】24点算法!不能用C只能用Delphi!

hzlan 2003-09-23 10:56:09
在算法论坛看到很多讨论24点算法的帖子,全部都是用C写的,大家能不能用delphi写出同样的算法。
...全文
25 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
popmailzjw 2003-09-25
  • 打赏
  • 举报
回复
^D
hzlan 2003-09-24
  • 打赏
  • 举报
回复
zswangII(伴水清清)(职业清洁工)
达到算法的功能,但还有些地方需要完善。
1.输入1,2,3,4而返回的表达式为(((1+2)+3)*4)没有将多余的括号去掉。
2.没有将所有的表达式列出。
3.在将所有的表达式列出后,将重复的表达式过滤等。
xhfjy 2003-09-24
  • 打赏
  • 举报
回复
mark
fj218 2003-09-24
  • 打赏
  • 举报
回复
本人写的24点程序
http://bbs.2ccc.com/uploads/fj218/card24.rar
hzlan 2003-09-24
  • 打赏
  • 举报
回复
我将代码稍微改了一下,列出所有表达式:
function CheckExpression(vExpS: String): String;
var
vLengthExpS:Integer;
begin
vLengthExpS:=Length(vExpS);
Result:=Copy(vExps,2,vLengthExps-2);
end;

procedure TForm1.SearchExpression(mNumbers: array of Integer;
mDest: Integer);
const
cPrecision = 1E-6;

var
vNumbers: array of Extended;
vExpressions: array of string;
vLength: Integer;

function fSearchExpression(mLevel: Integer): Boolean;
var
I, J: Integer;
A, B: Extended;
vExpA, vExpB: string;
begin
Result := True;
if (mLevel <= 1) and (Abs(vNumbers[0] - mDest) <= cPrecision) then Exit;

for I := 0 to mLevel - 1 do begin
for J := I + 1 to mLevel - 1 do begin
A := vNumbers[I];
B := vNumbers[J];
vNumbers[J] := vNumbers[mLevel - 1];

vExpA := vExpressions[I];
vExpB := vExpressions[J];
vExpressions[J] := vExpressions[mLevel - 1];

vExpressions[I] := '(' + vExpA + '+' + vExpB + ')';
vNumbers[I] := A + B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
vExpressions[I] := '(' + vExpA + '-' + vExpB + ')';
vNumbers[I] := A - B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
vExpressions[I] := '(' + vExpB + '-' + vExpA + ')';
vNumbers[I] := B - A;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
vExpressions[I] := '(' + vExpA + '*' + vExpB + ')';
vNumbers[I] := A * B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
if B <> 0 then begin
vExpressions[I] := '(' + vExpA + '/' + vExpB + ')';
vNumbers[I] := A / B;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
end;
if A <> 0 then begin
vExpressions[I] := '(' + vExpB + '/' + vExpA + ')';
vNumbers[I] := B / A;
if fSearchExpression(mLevel - 1) then Memo1.Lines.Add(CheckExpression(vExpressions[0]));
end;
vNumbers[I] := A;
vNumbers[J] := B;
vExpressions[I] := vExpA;
vExpressions[J] := vExpB;
end;
end;
Result := False;
end; { fSearchExpression }

var
I: Integer;
begin
vLength := Length(mNumbers);
SetLength(vNumbers, vLength);
SetLength(vExpressions, vLength);
for I := 0 to vLength - 1 do begin
vNumbers[I] := mNumbers[I];
vExpressions[I] := IntToStr(mNumbers[I]);
end;
if fSearchExpression(vLength) then
Memo1.Lines.Add( vExpressions[0]);

vNumbers := nil;
vExpressions := nil;
end; { SearchExpression }
///////End Source

///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
SearchExpression([1, 2, 3, 4], 24);
if Memo1.Lines.Count>0 then
showmessage('成功计算出结果,请核对!')
else
showmessage('不能计算出结果,请重新出题!');
end;
hzlan 2003-09-23
  • 打赏
  • 举报
回复
在C里用到的有些Func在Delphi里是要自已写的,而不是简单的翻译就可以的。
而且既然这么简单的话,还没有一个人翻译过来贴上来的。
FrameSniper 2003-09-23
  • 打赏
  • 举报
回复
那就别忧郁了!杀!
windindance 2003-09-23
  • 打赏
  • 举报
回复
myling(阿德):
看见你的1点信誉就有删除你的冲动……
windindance 2003-09-23
  • 打赏
  • 举报
回复
faint
要转换还不简单……
哪怕是FORTRAN或者ADA,COBOL,都是可以做的……
myling 2003-09-23
  • 打赏
  • 举报
回复
用C写的,大家能不能用delphi写出同样的算法


看看语法,然后翻译就行了
sailer_shi 2003-09-23
  • 打赏
  • 举报
回复
我顶
zswangII 2003-09-23
  • 打赏
  • 举报
回复
(*//
标题:类似计算加减乘除二十四的算法
说明:参考http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=422
修改:Zswang
日期:2003-03-17
支持:wjhu111@21cn.com
//*)

///////Begin Source
function SearchExpression(mNumbers: array of Integer;
mDest: Integer): string;
const
cPrecision = 1E-6;

var
vNumbers: array of Extended;
vExpressions: array of string;
vLength: Integer;

function fSearchExpression(mLevel: Integer): Boolean;
var
I, J: Integer;
A, B: Extended;
vExpA, vExpB: string;
begin
Result := True;
if (mLevel <= 1) and (Abs(vNumbers[0] - mDest) <= cPrecision) then Exit;

for I := 0 to mLevel - 1 do begin
for J := I + 1 to mLevel - 1 do begin
A := vNumbers[I];
B := vNumbers[J];
vNumbers[J] := vNumbers[mLevel - 1];

vExpA := vExpressions[I];
vExpB := vExpressions[J];
vExpressions[J] := vExpressions[mLevel - 1];

vExpressions[I] := '(' + vExpA + '+' + vExpB + ')';
vNumbers[I] := A + B;
if fSearchExpression(mLevel - 1) then Exit;
vExpressions[I] := '(' + vExpA + '-' + vExpB + ')';
vNumbers[I] := A - B;
if fSearchExpression(mLevel - 1) then Exit;
vExpressions[I] := '(' + vExpB + '-' + vExpA + ')';
vNumbers[I] := B - A;
if fSearchExpression(mLevel - 1) then Exit;
vExpressions[I] := '(' + vExpA + '*' + vExpB + ')';
vNumbers[I] := A * B;
if fSearchExpression(mLevel - 1) then Exit;
if B <> 0 then begin
vExpressions[I] := '(' + vExpA + '/' + vExpB + ')';
vNumbers[I] := A / B;
if fSearchExpression(mLevel - 1) then Exit;
end;
if A <> 0 then begin
vExpressions[I] := '(' + vExpB + '/' + vExpA + ')';
vNumbers[I] := B / A;
if fSearchExpression(mLevel - 1) then Exit;
end;
vNumbers[I] := A;
vNumbers[J] := B;
vExpressions[I] := vExpA;
vExpressions[J] := vExpB;
end;
end;
Result := False;
end; { fSearchExpression }

var
I: Integer;
begin
vLength := Length(mNumbers);
SetLength(vNumbers, vLength);
SetLength(vExpressions, vLength);
for I := 0 to vLength - 1 do begin
vNumbers[I] := mNumbers[I];
vExpressions[I] := IntToStr(mNumbers[I]);
end;
if fSearchExpression(vLength) then
Result := vExpressions[0]
else Result := '';
vNumbers := nil;
vExpressions := nil;
end; { SearchExpression }
///////End Source

///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := SearchExpression([7, 7, 4, 4], 24);
end;
///////End Demo
Delphi_Li 2003-09-23
  • 打赏
  • 举报
回复
C与Delphi有多大区别???不就是北京话和上海话的区别吗???只是写法不同,但是表达的内容是一样的!!!关键在于匿名不明白24点的算法,如果不明白用什么语言你都写不出来!!!
windindance 2003-09-23
  • 打赏
  • 举报
回复
……小函数可以帮你写
整段的翻译一般谁有那个时间?

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧