AOJ2002 X-Ray Screening System

X-Ray Screening System | Aizu Online Judge

上記の調査結果をふまえて,以下のような手荷物検査のためのモデルを考案した.それぞれの手荷物は X 線に対して透明である直方体の容器だとみなす.その中には X 線に対して不透明である複数の品物が入っている.ここで,直方体の 3 辺を x 軸,y 軸,z 軸とする座標系を考え,x 軸と平行な方向に X 線を照射して,y-z 平面に投影された画像を撮影する.撮影された画像は適当な大きさの格子に分割され,画像解析によって,それぞれの格子領域に映っている品物の材質が推定される.この会社には非常に高度の解析技術があり,材質の詳細な違いすらも解析することが可能であることから,品物の材質は互いに異なると考えることができる.なお,複数の品物が x 軸方向に関して重なっているときは,それぞれの格子領域について最も手前にある,すなわち x 座標が最小である品物の材質が得られる.また,2 つ以上の品物の x 座標が等しいことはないと仮定する.

もっとも手前にある品物から順番に処理していく.長方形なので,一番左上と右下 を持っておき, の4角形全てに同じ品物の材質,または前面に他の品物がある時に埋めた.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int w, h;
int sy, sx, gy, gx;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

bool can(int y,int x) {
  if(0 <= y && y < h && 0 <= x && x < w) return true;
  return false;
}

vector<string> s;
char c;
bool used[55][55], visited[55][55];

bool check() {
  REP(i, sy, gy+1){
      REP(j, sx, gx+1) {
          if(s[i][j] == c || used[i][j]) continue;
          return false;
      }
  }
  return true;
}

void f() {
  REP(i, sy, gy+1) {
      REP(j, sx, gx+1) {
          used[i][j] = true;
      }
  }
}

int main() {
  int n;
  cin >> n;

  rep(q, n) {
      cin >> h >> w;
      s.resize(h);
      rep(i, h) cin >> s[i];

      memset(used, 0, sizeof(used));
      set<char> S;

      bool flag = true, update = true;
      while(update) {
          update = false;
          rep(i, h) {
              rep(j, w) {
                  if(s[i][j] == '.') continue;

                  if(used[i][j]) continue;

                  sy = i;
                  sx = j;
                  gy = i;
                  gx = j;
                  c = s[i][j];
                  memset(visited, 0, sizeof(visited));

                  rep(k, h) {
                      rep(l, w) {
                          if(s[k][l] == c) {
                              sy = min(sy, k);
                              sx = min(sx, l);
                              gy = max(gy, k);
                              gx = max(gx, l);
                          }
                      }
                  }

                  if(S.find(c) == S.end() && check()) {
                      f();
                      S.insert(c);
                      update = true;
                  }
              }
          }
      }

      rep(i, h) {
          rep(j, w) {
              if(used[i][j]) continue;
              if(s[i][j] == '.') continue;
              flag = false;
          }
      }

      if(flag) cout << "SAFE" << endl;
      else cout << "SUSPICIOUS" << endl;

  }

  return 0;
}
Mar 23rd, 2016