結果

問題 No.460 裏表ちわーわ
ユーザー nebukuro09
提出日時 2016-12-15 22:46:18
言語 D
(dmd 2.083.0)
結果
AC  
実行時間 6 ms
コード長 1,688 Byte
コンパイル時間 1,849 ms
使用メモリ 8,916 KB
最終ジャッジ日時 2019-07-30 00:36:44

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
0.txt AC 2 ms
6,868 KB
1.txt AC 1 ms
6,868 KB
2.txt AC 2 ms
6,872 KB
3.txt AC 2 ms
6,872 KB
4.txt AC 3 ms
6,872 KB
5.txt AC 3 ms
6,868 KB
6.txt AC 6 ms
8,912 KB
7.txt AC 6 ms
6,872 KB
8.txt AC 5 ms
6,868 KB
9.txt AC 3 ms
6,872 KB
10.txt AC 4 ms
6,872 KB
11.txt AC 6 ms
6,868 KB
12.txt AC 3 ms
6,868 KB
13.txt AC 3 ms
6,868 KB
14.txt AC 6 ms
6,872 KB
15.txt AC 6 ms
6,872 KB
16.txt AC 6 ms
8,912 KB
17.txt AC 3 ms
8,916 KB
18.txt AC 4 ms
6,868 KB
19.txt AC 6 ms
6,868 KB
20.txt AC 6 ms
6,868 KB
21.txt AC 3 ms
6,872 KB
22.txt AC 3 ms
6,872 KB
23.txt AC 3 ms
6,868 KB
24.txt AC 4 ms
6,872 KB
25.txt AC 3 ms
6,868 KB
26.txt AC 6 ms
6,868 KB
27.txt AC 3 ms
6,868 KB
テストケース一括ダウンロード

ソースコード

diff #
import std.stdio;
import std.array;
import std.string;
import std.conv;
import std.algorithm;
import std.typecons;
import std.range;
import std.random;
import std.math;
import std.container;
import std.numeric;
import std.bigint;
import core.bitop;


void main() {
  auto s = readln.split.map!(to!int);
  auto H = s[0];
  auto W = s[1];
  auto A = H.iota.map!(_ => readln.split.map!(to!int).array).array;
  auto B = new int[](H+1);
  foreach (i; 0..H) {
    int b = 0;
    foreach (j; 0..W)
      if (A[i][j] == 1)
        b |= (1 << j);
    B[i] = b;
  }

  auto p = new int[](1<<W);
  foreach (i; 0..(1<<W))
    p[i] = 2^^30-1;
  foreach (on; 0..(1<<W)) {
    foreach (push; 0..(1<<W)) {
      auto tmp = on;
      foreach (i; 0..W)
        if (push & (1 << i))
          tmp ^= (((0b111 << i) >> 1) & ((1 << W) - 1));
      if (tmp == 0 && p[on].popcnt > push.popcnt)
        p[on] = push;
    }
  }

  int ans = int.max;
  foreach (top; 0..(1<<W)) {
    auto tmp_b = B.dup;
    int tmp_ans = top.popcnt;

    foreach (i; 0..W) {
      if (top & (1 << i)) {
        tmp_b[0] ^= (((0b111 << i) >> 1) & ((1 << W) -1));
        tmp_b[1] ^= (((0b111 << i) >> 1) & ((1 << W) -1));
      }
    }

    foreach (i; 1..H) {
      if (p[tmp_b[i-1]] == 2^^30-1) {
        tmp_ans = int.max;
        break;
      }
      tmp_ans += p[tmp_b[i-1]].popcnt;
      foreach (j; 0..W)
        if (p[tmp_b[i-1]] & (1 << j)) {
          tmp_b[i] ^= (((0b111 << j) >> 1) & ((1 << W) -1));
          tmp_b[i+1] ^= (((0b111 << j) >> 1) & ((1 << W) -1));
        }
    }
    if (tmp_b[H-1] != 0) tmp_ans = int.max;
    ans = min(ans, tmp_ans);
  }

  (ans == int.max ? "Impossible" : ans.to!string).writeln;
}
0