/*
PROG: starry
LANG: C++
*/
#include
<
cstdio
>
#include
<
cstring
>
#include
<
cstdlib
>
using
namespace
std;
struct
Arr{
int
top,down,left,right,num,col;
Arr():top(
101
),down(
-
1
),left(
101
),right(
-
1
),num(
0
){}
}St[
510
];
int
N,H,W;
int
x1,y1,x2,y2;
int
a1,b1,a2,b2;
char
C[
510
];
char
M[
110
][
110
];
int
G[
110
][
110
];
int
S[
110
][
110
];
void
flood(
int
x,
int
y){
S[x][y]
=
N;
for
(
int
d1
=-
1
;d1
<=
1
;
++
d1)
for
(
int
d2
=-
1
;d2
<=
1
;
++
d2){
int
xi
=
x
+
d1,yi
=
y
+
d2;
if
(M[xi][yi]
==
'
1
'
&&
S[xi][yi]
==-
1
)
flood(xi,yi);
}
}
void
init()
{
scanf(
"
%d%d
"
,
&
W,
&
H);
memset(M,
'
#
'
,
sizeof
(M));
for
(
int
i
=
1
;i
<=
H;
++
i)
scanf(
"
%s
"
,M[i]
+
1
);
memset(S,
-
1
,
sizeof
(S));
N
=
0
;
for
(
int
i
=
1
;i
<=
H;
++
i)
for
(
int
j
=
1
;j
<=
W;
++
j)
if
(M[i][j]
==
'
1
'
&&
S[i][j]
==-
1
){
N
++
;
flood(i,j);
}
for
(
int
i
=
1
;i
<=
H;
++
i)
for
(
int
j
=
1
;j
<=
W;
++
j){
if
(
-
1
==
S[i][j])
continue
;
Arr
&
now
=
St[S[i][j]];
now.num
++
;
now.col
=
S[i][j];
if
(i
<
now.top) now.top
=
i;
if
(j
<
now.left) now.left
=
j;
if
(i
>
now.down) now.down
=
i;
if
(j
>
now.right) now.right
=
j;
}
}
void
turn0_1()
{
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
G[i][j]
=
S[i][j];
}
void
turn0_2()
{
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
G[j][i]
=
S[i][j];
int
tmp
=
x1; x1
=
y1; y1
=
tmp;
tmp
=
x2; x2
=
y2; y2
=
tmp;
}
void
turn1()
{
int
g[
110
][
110
];
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
g[i][y1
+
y2
-
j]
=
G[i][j];
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
G[i][j]
=
g[i][j];
}
void
turn2()
{
int
g[
110
][
110
];
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
g[x1
+
x2
-
i][j]
=
G[i][j];
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
G[i][j]
=
g[i][j];
}
void
turn3()
{
int
g[
110
][
110
];
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
g[i][y1
+
y2
-
j]
=
G[i][j];
for
(
int
i
=
x1;i
<=
x2;
++
i)
for
(
int
j
=
y1;j
<=
y2;
++
j)
G[i][j]
=
g[i][j];
}
bool
tf(
int
x,
int
y)
{
for
(
int
i
=
1
;i
<=
x2
-
x1
+
1
;
++
i)
for
(
int
j
=
1
;j
<=
y2
-
y1
+
1
;
++
j)
if
((G[x1
+
i
-
1
][y1
+
j
-
1
]
==
y)
^
(S[a1
+
i
-
1
][b1
+
j
-
1
]
==
x))
return
0
;
return
1
;
}
bool
check(
int
x,
int
y)
{
if
(St[x].num
!=
St[y].num)
return
0
;
if
(St[x].down
-
St[x].top
==
St[y].down
-
St[y].top
&&
St[x].right
-
St[x].left
==
St[y].right
-
St[y].left){
a1
=
St[x].top; b1
=
St[x].left; a2
=
St[x].down; b2
=
St[x].right;
x1
=
St[y].top; y1
=
St[y].left; x2
=
St[y].down; y2
=
St[y].right;
turn0_1();
if
(tf(x,y))
return
1
;
turn1();
if
(tf(x,y))
return
1
;
turn2();
if
(tf(x,y))
return
1
;
turn3();
if
(tf(x,y))
return
1
;
}
if
(St[x].down
-
St[x].top
==
St[y].right
-
St[y].left
&&
St[x].right
-
St[x].left
==
St[y].down
-
St[y].top){
a1
=
St[x].top; b1
=
St[x].left; a2
=
St[x].down; b2
=
St[x].right;
x1
=
St[y].top; y1
=
St[y].left; x2
=
St[y].down; y2
=
St[y].right;
turn0_2();
if
(tf(x,y))
return
1
;
turn1();
if
(tf(x,y))
return
1
;
turn2();
if
(tf(x,y))
return
1
;
turn3();
if
(tf(x,y))
return
1
;
}
return
0
;
}
void
solve()
{
for
(
int
i
=
1
;i
<=
N;
++
i)
C[i]
=
'
#
'
;
char
c
=
'
a
'
;
for
(
int
i
=
1
;i
<=
N;
++
i){
if
(C[i]
!=
'
#
'
)
continue
;
C[i]
=
c
++
;
for
(
int
j
=
i
+
1
;j
<=
N;
++
j)
if
(check(i,j))
C[j]
=
C[i];
}
}
void
out
()
{
for
(
int
i
=
1
;i
<=
H;
++
i){
for
(
int
j
=
1
;j
<=
W;
++
j)
if
(S[i][j]
>
0
)
printf(
"
%c
"
,C[S[i][j]]);
else
printf(
"
0
"
);
printf(
"
\n
"
);
}
}
int
main()
{
freopen(
"
starry.in
"
,
"
r
"
,stdin);
freopen(
"
starry.out
"
,
"
w
"
,stdout);
init();
solve();
out
();
return
0
;
}
/*
Executing
Test 1: TEST OK [0.000 secs, 2920 KB]
Test 2: TEST OK [0.000 secs, 2920 KB]
Test 3: TEST OK [0.011 secs, 2920 KB]
Test 4: TEST OK [0.011 secs, 2920 KB]
Test 5: TEST OK [0.011 secs, 2920 KB]
All tests OK.
Your program ('starry') produced all correct answers! This is your submission #5 for this problem. Congratulations!
*/
posted on 2009-07-23 13:51
xfstart07 阅读(105)
评论(0) 编辑 收藏 引用