程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1830(位運算+雙向DFS)

POJ 1830(位運算+雙向DFS)

編輯:C++入門知識

此題也可用GE做,可是我不會矩陣乘法……

[delphi] 
Program P1830; 
const 
   maxn=28; 
   maxf=100007; 
   none=-2139062144; 
var 
   ans,tt,n,i,j,s,t,mid:longint; 
   b:array[1..29] of longint; 
   h,num:array[0..maxf] of longint; 
 
function hash(x:longint):longint; 
var 
   i,j:longint; 
begin 
   hash:=x mod maxf; 
   while (num[hash]<>x) and (num[hash]<>none) do 
   begin 
      hash:=(hash+1) mod maxf; 
   end; 
   num[hash]:=x; 
   exit(hash); 
end; 
procedure dfs(x,l:longint); 
var 
   i,j:longint; 
begin 
   if l=mid+1 then 
   begin 
      inc(h[hash(x)]); 
      exit; 
   end; 
   for i:=l to mid do 
      dfs(x xor b[i],i+1); 
   dfs(x,mid+1); 
 
end; 
procedure find(x,l:longint); 
var 
   i,j:longint; 
begin 
   if l=n+1 then 
   begin 
      inc(ans,h[hash(x)]); 
      exit; 
   end; 
   for i:=l to n do 
      find(x xor b[i],i+1); 
   find(x,n+1); 
 
end; 
 
begin 
   read(tt); 
   while (tt>0) do 
   begin 
      ans:=0; 
      fillchar(b,sizeof(b),0); 
      fillchar(num,sizeof(num),128); 
      fillchar(h,sizeof(h),0); 
 
      read(n); 
      s:=0; 
      for i:=1 to n do 
      begin 
         read(j); 
         if j=1 then inc(s,1 shl (i-1)); 
      end; 
      t:=0; 
      for i:=1 to n do 
      begin 
         read(j); 
         if j=1 then inc(t,1 shl (i-1)); 
      end; 
      while (true) do 
      begin 
         read(i,j); 
         if (i=0) and (j=0) then break; 
         inc(b[i],1 shl (j-1)); 
      end; 
      for i:=1 to n do inc(b[i],1 shl (i-1)); 
      mid:=n shr 1; 
      dfs(s,1); 
      find(t,mid+1); 
      if ans=0 then writeln('Oh,it''s impossible~!!') else 
      writeln(ans); 
      dec(tt); 
   end; 
end. 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved