ac2f3a08创建于 2020年5月13日历史提交
% https://codingcompetitions.withgoogle.com/codejam/round/00000000002017f7/00000000002017f8
import util, mip.

go(N, T, X1, X2, X3) =>
  Board0 = new_array(N, N),
  Board1 = new_array(N, N),
  Board2 = new_array(N, N),
  Board3 = new_array(N, N),
  Board0 :: 0..1,
  Board1 :: 0..1,
  Board2 :: 0..1,
  Board3 :: 0..1,
  foreach((I, J) in X1)
    Board0[I, J] #= 0,
    Board2[I, J] #= 0
  end,
  foreach((I, J) in X2)
    Board0[I, J] #= 0,
    Board1[I, J] #= 0
  end,
  foreach((I, J) in X3)
    Board0[I, J] #= 0,
    Board1[I, J] #= 0,
    Board2[I, J] #= 0,
    Board3[I, J] #= 1
  end,
  foreach(I in 1..N, J in 1..N)
    Board0[I, J] + Board1[I, J] + Board2[I, J] + Board3[I, J] #= 1
  end,
  foreach(I in 1..N)
    sum([Board2[I, J] + Board3[I, J] : J in 1..N]) #<= 1,
    sum([Board2[J, I] + Board3[J, I] : J in 1..N]) #<= 1,
  end,
  foreach(K in 2..2*N)
    sum([Board1[I, J] + Board3[I, J] : I in 1..N, J in 1..N, I + J = K]) #<= 1
  end,
  foreach(K in -(N-1)..N-1)
    sum([Board1[I, J] + Board3[I, J] : I in 1..N, J in 1..N, I - J = K]) #<= 1
  end,
  Sum #= sum([Board1[I, J] + Board2[I, J] + Board3[I, J] * 2 : I in 1..N, J in 1..N]),
  solve([$max(Sum)], [Board0, Board1, Board2, Board3]),
  X = [],
  [S1, S2, S3] = [new_set(X1), new_set(X2), new_set(X3)],
  foreach(I in 1..N, J in 1..N)
    if Board1[I, J] == 1, not S1.has_key((I, J)) then
      X := [to_fstring("+ %d %d", I, J)| X]
    elseif Board2[I, J] == 1, not S2.has_key((I, J)) then
      X := [to_fstring("x %d %d", I, J)| X]
    elseif Board3[I, J] == 1, not S3.has_key((I, J)) then
      X := [to_fstring("o %d %d", I, J)| X]
    end,
  end,
  printf(stderr, "Case #%d: %d %d\n", T, Sum, X.length),
  foreach (S in X)
    println(stderr, S)
  end.

main() =>
  T = read_number(),
  foreach(I in 1..T)
    X1 = [],
    X2 = [],
    X3 = [],
    [N, M] = [read_number() : J in 1..2],
    foreach(J in 1..M)
      [A, Y, X] = readln().split(),
      Y := Y.to_number(),
      X := X.to_number(),
      if A == "+" then
        X1 := [(Y, X)|X1]
      elseif A == "x" then
        X2 := [(Y, X)|X2]
      else
        X3 := [(Y, X)|X3]
      end,
    end,
    go(N, I, X1, X2, X3)
  end.