切换到宽版
  • 7489阅读
  • 5回复

Checker Challenge 跳棋的挑战 [复制链接]

上一主题 下一主题
离线danielzcc
 
只看楼主 倒序阅读 0 发表于: 2006-02-06
文字
USACO (Section 1.4 )中的 Checker Challenge 跳棋的挑战 怎么做时间才能最短。
大家帮帮忙呀。
只要能通过就行。
离线archimedes

只看该作者 1 发表于: 2006-02-07
剪枝,剪枝,剪枝,再剪枝
程序到网上去抄标程
离线danielzcc
只看该作者 2 发表于: 2006-02-08
哪里有好的标程,请告知一二,谢谢
离线stevenjl

只看该作者 3 发表于: 2006-02-08
楼主可是温州中学的?你参加今年的NOIP复赛了吗?……绍兴的那个……
Dream Walker...
离线stevenjl

只看该作者 4 发表于: 2006-02-08
  1. Program Checker;
  2.   Var diagPLUS: Array[2..30] Of Boolean;
  3.     diagMINUS: Array[-15..15] Of Boolean;
  4.     sol: Array[1..15] Of ShortInt;
  5.     i,n,found: Longint;
  6.     stop: Boolean;
  7.     next,prev: Array[0..16] Of ShortInt;
  8.     sy: ShortInt;
  9. Procedure Search0(y:ShortInt);
  10.   Var x,i:ShortInt;
  11. Begin
  12.   If stop Then Exit;
  13.   If y=n+1 Then Begin
  14.     Inc(found);
  15.     If found<4 Then Begin
  16.         For i:=1 To n-1 Do
  17.           Write(sol[i],' ');
  18.         Writeln(sol[n]);
  19.     End Else
  20.     stop:=True;
  21.     Exit;
  22.   End;
  23.   If sol[y]<>0 Then Begin
  24.     Search0(y+1);
  25.     Exit;
  26.   End;
  27.   x:=next[0];
  28.   While x<=n Do Begin
  29.     If Not ((diagPLUS[x+y]) Or (diagMINUS[x-y])) Then Begin
  30.         sol[y]:=x;
  31.         diagPLUS[x+y]:=True;
  32.         diagMINUS[x-y]:=True;
  33.         next[prev[x]]:=next[x];
  34.         prev[next[x]]:=prev[x];
  35.         Search0(y+1);
  36.         diagPLUS[x+y]:=False;
  37.         diagMINUS[x-y]:=False;
  38.         next[prev[x]]:=x; prev[next[x]]:=x;
  39.     End;
  40.     x:=next[x];
  41.   End;
  42.   sol[y]:=0;
  43. End;
  44. Procedure Search;
  45.   Var x:ShortInt;
  46. Begin
  47.   If sy=n+1 Then Begin
  48.     Inc(found);
  49.     Exit;
  50.   End;
  51.   If sol[sy]<>0 Then Begin
  52.     Inc(sy);
  53.     Search;
  54.     Dec(sy);
  55.     Exit;
  56.   End;
  57.   x:=next[0];
  58.   While x<=n Do Begin
  59.     If Not ((diagPLUS[x+sy]) Or (diagMINUS[x-sy])) Then Begin
  60.         sol[sy]:=x;
  61.         diagPLUS[x+sy]:=True;
  62.         diagMINUS[x-sy]:=True;
  63.         next[prev[x]]:=next[x];
  64.         prev[next[x]]:=prev[x];
  65.         Inc(sy);
  66.         Search;
  67.         Dec(sy);
  68.         diagPLUS[x+sy]:=False;
  69.         diagMINUS[x-sy]:=False;
  70.         next[prev[x]]:=x;
  71.         prev[next[x]]:=x;
  72.     End;
  73.     x:=next[x];
  74.   End;
  75.   sol[sy]:=0;
  76. End;
  77. Procedure Search2(miny:Longint);
  78.   Var x,y,i:ShortInt;
  79.       curf:Longint;
  80. Begin
  81.   x:=n Div 2+1;
  82.   For y:=miny To n Div 2 Do
  83.     If Not (diagPLUS[x+y] Or diagMINUS[x-y]) Then Begin
  84.         curf:=found;
  85.         sol[y]:=x;
  86.         diagPLUS[x+y]:=True;
  87.         diagMINUS[x-y]:=True;
  88.         next[prev[x]]:=next[x]; prev[next[x]]:=prev[x];
  89.         sy:=1;
  90.         Search;
  91.         If y>miny Then
  92.           found:=found+(found-curf);
  93.         sol[y]:=0;
  94.         diagPLUS[x+y]:=False;
  95.         diagMINUS[x-y]:=False;
  96.         next[prev[x]]:=x; prev[next[x]]:=x;
  97.     End;
  98. End;
  99. Procedure Search1;
  100.   Var x,y,i:ShortInt;
  101. Begin
  102.   y:=n Div 2+1;
  103.   For x:=1 To n Div 2 Do Begin
  104.     sol[y]:=x;
  105.     diagPLUS[x+y]:=True;
  106.     diagMINUS[x-y]:=True;
  107.     next[prev[x]]:=next[x]; prev[next[x]]:=prev[x];
  108.     Search2(x);
  109.     diagPLUS[x+y]:=False;
  110.     diagMINUS[x-y]:=False;
  111.     next[prev[x]]:=x; prev[next[x]]:=x;
  112.   End;
  113.   sol[y]:=0;
  114.   found:=found*4;
  115.   x:=n Div 2+1;
  116.   sol[y]:=x;
  117.   diagPLUS[x+y]:=True;
  118.   diagMINUS[x-y]:=True;
  119.   next[prev[x]]:=next[x]; prev[next[x]]:=prev[x];
  120.   sy:=1;
  121.   Search;
  122. End;
  123. Begin
  124.   Assign(Input,'checker.in'); Reset(Input);
  125.   Assign(Output,'checker.out'); Rewrite(Output);
  126.   Read(n);
  127.   found:=0;
  128.   FillChar(diagPLUS,SizeOf(diagPLUS),False);
  129.   FillChar(diagMINUS,SizeOf(diagMINUS),False);
  130.   FillChar(sol,SizeOf(sol),0);
  131.   For i:=0 To n+1 Do Begin
  132.     prev[i]:=i-1;
  133.     next[i]:=i+1;
  134.   End;
  135.   If n Mod 2=0 Then Begin
  136.     stop:=False;
  137.     Search0(1);
  138.     sy:=1;
  139.     found:=0;
  140.     Search;
  141.   End Else Begin
  142.     stop:=False;
  143.     Search0(1);
  144.     found:=0;
  145.     Search1;
  146.   End;
  147.     Writeln(found);
  148.     Close(Output);
  149. End.
Dream Walker...
离线lipeiqian
只看该作者 5 发表于: 2006-06-11
  1. /*
  2. TASK: checker
  3. LANG: C++
  4. */
  5. #include <fstream>
  6. using namespace std;
  7. ifstream fin("checker.in");
  8. ofstream fout("checker.out");
  9. int n,pr=0,p=0,h[15];
  10. char c[15],db[40],dc[28];
  11. void work(int k)
  12. {
  13.   int i;
  14.   if(k>n)
  15.   {
  16.     p+=2;
  17.     if(n%2==1&&h[1]==(n+1)/2||n<=6) p--;
  18.     if(++pr<=3)
  19.     {
  20.         for(i=1;i<n;i++) fout<<h[i]<<' ';
  21.         fout<<h[n]<<endl;
  22.     }
  23.     return;
  24.   }
  25.   for(i=1;i<=(k==1&&n>6?(n+1)/2:n);i++)
  26.   {
  27.     if(db[i+k]==0&&dc[k-i+15]==0&&c[i]==0)
  28.     {
  29.         h[k]=i;
  30.         db[i+k]=1;
  31.         dc[k-i+15]=1;
  32.         c[i]=1;
  33.         work(k+1);
  34.         db[i+k]=0;
  35.         dc[k-i+15]=0;
  36.         c[i]=0;
  37.     }
  38.   }
  39. }
  40. int main()
  41. {
  42.   fin>>n;
  43.   work(1);
  44.   fout<<p<<endl;
  45.   return 0;
  46. }
快速回复
限100 字节
 
上一个 下一个