Zero Sum (zerosum)[USACO 2.3.3]

本文介绍了一个使用Pascal语言实现的零和游戏求解算法。该算法通过深度优先搜索来寻找所有可能使最终表达式等于零的组合方式。文章详细展示了如何初始化变量、递归搜索过程以及最终输出解决方案。
{
ID:1011mashuo
PROG:zerosum
LANG:PASCAL
}
program zerosum;

var
	n,tot:longint;
	ph,num:array [0..9] of longint;
	fh:array [1..3] of char;//fh代表符号,因为要按照ASCⅡ码的顺序,所以是空格->加号->减号这个顺序。
	
procedure init;
begin
	fh[1]:=' ';
	fh[2]:='+';
	fh[3]:='-';
	readln(n);
	ph[n]:=2;//这里其实设2,3中的任何一个数都可以,但是惟独不能设为1,因为我们只是要把n之前的数都统计出来而不管n之后是什么,所以2,3都可以,但是如果为1的话,n之前的最后1个数就不能统计出来了,就会出现错误的情况。因为本身ph[i]影响的是第i+1个数,而到n时n+1为空,所以设任意一个数就行(不会有符号的影响),这里要注意符号是总比数值靠后一位的。
end;

procedure dfs(x:longint);
var
	i,ans:longint;
	s,ss:string;
begin
	if x<>n then//如果还没搜到第n位
		begin
			for i:=1 to 3 do 
				begin
					ph[x]:=i;//先把第x+1位的符号确定一下。
					dfs(x+1);
				end;
		end
	else
		begin
			str(1,s);//先手工将1加到字符串里。
			tot:=0;
			for i:=1 to n do//注意,ph[1]影响的是ph[2],它是第二位之前的符号。
				begin
					case ph[i] of
						1:begin//因为前面的符号是1,即空格,那就把两个数合成。
								str(i+1,ss);
								s:=s+ss;
							end;
						2:begin//因为前面的符号是2,即加号,先把之前的数丢进数组里,再继续把数放进s中。
								inc(tot);
								val(s,num[tot]);
								str(i+1,s);
							end;
						3:begin//因为前面的符号是3,即减号,先把之前的数丢进数组里,再继续把数放进s中,并且还要加上一个减号。
								inc(tot);
								val(s,num[tot]);
								str(i+1,s);
								s:='-'+s;
							end;
					end;{case}
				end;
			ans:=0;
			for i:=1 to tot do inc(ans,num[i]);
			//检验,看是否ans=0,能,就是一种方案,输出即可;不能,直接退出。
			if ans=0 then
				begin
					for i:=1 to n-1 do write(i,fh[ph[i]]);//先输数字,再输下一位的符号(因为1没有符号)。
					writeln(n);//最后输出n,而它之后也不再有符号。
				end
			else exit;
		end;
end;

begin
	assign(input,'zerosum.in'); reset(input);
	assign(output,'zerosum.out'); rewrite(output);

	init;
	dfs(1);

	close(input); close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值