游戏——jzoj 1591

题目描述

两个核武器科学家Patrick和Roland,在研究核武器时突然觉得无聊,玩起了游戏,游戏当然也是跟核武器有关,游戏一开始在桌子上放了一些核材料,两个人轮流玩,Patrick先玩。游戏规则是每次玩家可以从这些核材料里选一些材料放到反应堆去,当然结果就是化为乌有,由于游戏太危险,所以只有A,B,C,D四种材料,而且允许的反应只有以下5种:

  1. AABDD

  2. ABCD

  3. CCD

  4. BBB

  5. AD

当某个人选不到材料进行反应时就输了,大家要知道两个人都是绝顶聪明的。

输入

第一行输入一个整数N(1<=N<=100),表示游戏次数,接下来N行,每行四个整数,分别表示游戏开始时A,B,C,D四种材料的数量。假设一开始每种材料的数量都在0到60之间。

输出

对于每次游戏输出赢者的名字。

样例输入

6
0 2 0 2
1 3 1 3
1 5 0 3
3 3 3 3
8 8 6 7
8 8 8 8

样例输出

Roland
Patrick
Roland
Roland
Roland
Patrick

题解:这题用记忆化搜索。

const v:array[1..5,1..4] of longint=((2,1,0,2),(1,1,1,1),(0,0,2,1),(0,3,0,0),(1,0,0,1));
var a,b,c,d,n,i:longint;
    f:array[0..60,0..60,0..60,0..60] of longint;

function search(a,b,c,d:longint):longint;
var i,j,k:longint;
begin
  if (f[a,b,c,d]<>0) then exit(f[a,b,c,d]);
  for i:=1 to 5 do
   begin
     if (a>=v[i,1])and(b>=v[i,2])and(c>=v[i,3])and(d>=v[i,4]) then
      begin
        if search(a-v[i,1],b-v[i,2],c-v[i,3],d-v[i,4])=2 then
         begin
           f[a,b,c,d]:=1;
           exit(1);
         end;
      end;
   end;
   f[a,b,c,d]:=2;
   exit(2);
end;

begin
  assign(input,'j5.in');
  assign(output,'j5.out');
  reset(input);
  rewrite(output);
  readln(n);
  for i:=1 to n do
   begin
     readln(a,b,c,d);
     if search(a,b,c,d)=2 then writeln('Roland')
      else writeln('Patrick');
   end;
   close(input);close(output);
end.

你可能感兴趣的:(深搜)