永发信息网

求VIJOS(p1016)北京2008挂钟问题的宽搜解决方法

答案:1  悬赏:70  手机版
解决时间 2021-11-12 08:45
求VIJOS(p1016)北京2008挂钟问题的宽搜解决方法
最佳答案
看一看我的

const
dir:array[1..9,1..9]of integer=((1,1,0,1,1,0,0,0,0),
(1,1,1,0,0,0,0,0,0),
(0,1,1,0,1,1,0,0,0),
(1,0,0,1,0,0,1,0,0),
(0,1,0,1,1,1,0,1,0),
(0,0,1,0,0,1,0,0,1),
(0,0,0,1,1,0,1,1,0),
(0,0,0,0,0,0,1,1,1),
(0,0,0,0,1,1,0,1,1));
dd:array[1..9]of longint=(1,4,16,64,256,1024,4096,16324,65536);
type
aa=array[1..9]of longint;
var
i,j,k,st,ta:longint;
que:array[0..300000,1..9]of longint;
pre:array[0..300000]of longint;
ch:array[0..300000]of longint;
f:array[0..300000]of boolean;

function deal(a:aa):longint;
var sum,i:longint;
begin
sum:=0;
for i:=1 to 9 do
sum:=sum+a[9-i+1]*dd[i];
deal:=sum;
end;

procedure out(m:longint);
begin
if m=0 then exit;
out(pre[m]);
write(ch[m],' ');
end;

procedure check;
var
i,j,k:longint;
a:aa;
begin
st:=0; ta:=0;
pre[0]:=0;
repeat
for i:=1 to 9 do
begin
for j:=1 to 9 do
a[j]:=(que[st,j]+dir[i,j]) mod 4;
k:=deal(a);
if not f[k]
then begin
f[k]:=true;
inc(ta);
que[ta]:=a;
pre[ta]:=st;
ch[ta]:=i;
end;

if f[0] then
begin
out(ta);
halt;
end;
end;
inc(st);
until st>ta;
end;

begin
for i:=1 to 9 do
read(que[0,i]);
fillchar(f,sizeof(f),false);
f[deal(que[0])]:=true;
check;
end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
增容是什么意思
开封17路单程约多长时间
从郴州坐火车到镇江所经过的所有站点都有那些
为什么在word中的表格本来在一页上,从一个电
怎么进这个6BOSS的红门
有人听过资金流操作法吗?
检脸改错字
算命高人在哪里
诗经反映战争的诗歌中,哪些诗篇具有爱国主义
注册ML域名DNS应该怎么填
用汇编语言编写子程序后如何调用?
灵璧房地产交易所地址好找么,我有些事要过去
()is better than the God. ()is worse t
我甲减,事业编体检会不会受影响啊?
你好我想问一下,我军照是B,回到地方想换A照
推荐资讯
一指倾城私人定制地址在什么地方,想过去办事
第一次见长辈送什么东西??
教师失职导致学生受伤害教师应承担什么责任
寻求日本动漫
现在还有没有像借贷宝那样的手机软件邀请一人
重庆市两江新区坐几号线轻轨
辽宁保安肩章等级
感情比较单一是啥意思????
奥迪q5的左右驾驶转换激活是什么意思
一款红酒上写着Gausan Grenache Merlot 2009
长期吃甲泼泥龙片有什么副作用
一次性注射器是什么材料
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?