讨论 / DFS+位运算+pascal卡次数3500万+从右下角开始搜=AC
lifei 2012-07-25 08:40:00
点我顶贴 收藏 删除
状态: Accepted

测评机: Xeond[6]

得分: 100分 [我要评价一下题目~]

提交日期: 2012-7-25 21:11:00

有效耗时: 7437毫秒

测试结果1: 通过本测试点|有效耗时187ms

测试结果2: 通过本测试点|有效耗时188ms

测试结果3: 通过本测试点|有效耗时172ms

测试结果4: 通过本测试点|有效耗时172ms

测试结果5: 通过本测试点|有效耗时203ms

测试结果6: 通过本测试点|有效耗时156ms

测试结果7: 通过本测试点|有效耗时172ms

测试结果8: 通过本测试点|有效耗时172ms

测试结果9: 通过本测试点|有效耗时172ms

测试结果10: 通过本测试点|有效耗时172ms

测试结果11: 通过本测试点|有效耗时468ms

测试结果12: 通过本测试点|有效耗时157ms

测试结果13: 通过本测试点|有效耗时421ms

测试结果14: 通过本测试点|有效耗时532ms

测试结果15: 通过本测试点|有效耗时234ms

测试结果16: 通过本测试点|有效耗时344ms

测试结果17: 通过本测试点|有效耗时312ms

测试结果18: 通过本测试点|有效耗时438ms

测试结果19: 通过本测试点|有效耗时2000ms

测试结果20: 通过本测试点|有效耗时765ms

const nine:array[1..9,1..9]of longint=((1,1,1,2,2,2,3,3,3),

(1,1,1,2,2,2,3,3,3),

(1,1,1,2,2,2,3,3,3),

(4,4,4,5,5,5,6,6,6),

(4,4,4,5,5,5,6,6,6),

(4,4,4,5,5,5,6,6,6),

(7,7,7,8,8,8,9,9,9),

(7,7,7,8,8,8,9,9,9),

(7,7,7,8,8,8,9,9,9));

score:array[1..9,1..9]of longint=((6,6,6,6,6,6,6,6,6),

(6,7,7,7,7,7,7,7,6),

(6,7,8,8,8,8,8,7,6),

(6,7,8,9,9,9,8,7,6),

(6,7,8,9,10,9,8,7,6),

(6,7,8,9,9,9,8,7,6),

(6,7,8,8,8,8,8,7,6),

(6,7,7,7,7,7,7,7,6),

(6,6,6,6,6,6,6,6,6));

var g:array[1..9,1..9]of longint;

u:array[1..1000]of longint;

x,y,z:array[1..9]of longint;

ans,i,j,up,max,o:longint;f:boolean;

procedure dfs(m:longint);

var pos,p,xx,yy,zz,ss,a,b,t:longint;

begin

inc(o);

if m=0 then begin f:=true;if ans>max then max:=ans;exit;end;

if o>35000000 then exit;

a:=((m-1)div 9)+1;b:=m mod 9;if b=0 then b:=9;

if g[a,b]=0 then

begin

pos:=up and(not(x[a] or y[b] or z[nine[a,b]]));

while pos>0 do

begin

p:=pos and ((not pos)+1);

pos:=pos xor p;

xx:=x[a];yy:=y[b];zz:=z[nine[a,b]];ss:=ans;

x[a]:=x[a] or p;y[b]:=y[b] or p;z[nine[a,b]]:=z[nine[a,b]] or p;

t:=u[p]+1;

ans:=ans+t*score[a,b];

dfs(m-1);

x[a]:=xx;y[b]:=yy;z[nine[a,b]]:=zz;ans:=ss;g[a,b]:=0;

end;

end else dfs(m-1);

end;

begin

fillchar(g,sizeof(g),0);

fillchar(x,sizeof(x),0);

fillchar(y,sizeof(y),0);

fillchar(z,sizeof(z),0);

ans:=0;f:=false;

for i:=1 to 9 do

begin

for j:=1 to 9 do

begin

read(g[i,j]);

if g[i,j]>0 then

begin

ans:=ans+g[i,j]*score[i,j];

x[i]:=x[i] or (1 shl (g[i,j]-1));

y[j]:=y[j] or (1 shl (g[i,j]-1));

z[nine[i,j]]:=z[nine[i,j]] or(1 shl (g[i,j]-1));

end;

end;

readln;

end;

max:=ans;

for i:=0 to 8 do u[1 shl i]:=i;

up:=(1 shl 9)-1;

o:=0;

dfs(81);

if f then writeln(max) else writeln(-1);

end.

#1 897357142@2012-07-25 08:38:00
回复 删除
。。。。lz好麻烦,我记得倒着搜加剪枝加卡时850万就可以了
#2 897357142@2012-07-25 08:40:00
回复 删除
呃……抱歉发错了
查看更多回复
提交回复