题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3314
题目大意:给定一个n*m的矩阵,由1和m组成,m组成字母,问哪些字母在里面出现。
解题思路:简单模拟。统计每个字母的m个数,如果m个数相同再分类讨论。
测试数据:
9 16
11111MMMMMM111
1111111MM11111
1MM1111MM11111
1MM1111MM11111
1MM1111MM11111
1MM1111MM11111
1MM11MMMMMM111
1MM11111111111
1MMMMMMMMMMMM1
31 96
111111MMM11111111MMMMMMMMMMM111111111MMMMMMMM1111MMMMMMMMMMM11111MMMMMMMMMMMM1111MMMMMMMMMMMMM11
11111MM1MM1111111MM11111111MM111111MM1111111MM111MM111111111MM111MM11111111111111MM1111111111111
1111MM111MM111111MM11111111MM11111MM111111111MM11MM1111111111MM11MM11111111111111MM1111111111111
111MMMMMMMMM11111MMMMMMMMMMM111111MM1111111111111MM1111111111MM11MMMMMMMMMMMM1111MMMMMMMMMMMMM11
11MM1111111MM1111MM11111111MM11111MM111111111MM11MM1111111111MM11MM11111111111111MM1111111111111
1MMM11111111MM111MM11111111MM111111MM1111111MM111MM111111111MM111MM11111111111111MM1111111111111
1MM1111111111MM11MMMMMMMMMMM111111111MMMMMMMM1111MMMMMMMMMMM11111MMMMMMMMMMMM1111MM1111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111MMMMMMMM1111MM111111111MM1111111MMMMMM111111111MMMMMMMM111111MM111111MMM11111MM111111111111
111MM1111111MM111MM111111111MM111111111MM11111111111111MM111111111MM11111MMM111111MM111111111111
11MM111111111MM11MM111111111MM111111111MM11111111111111MM111111111MM111MMM11111111MM111111111111
11MM1111111111111MMMMMMMMMMMMM111111111MM11111111111111MM111111111MMMMM11111111111MM111111111111
11MM111111MMMMM11MM111111111MM111111111MM1111111111MM11MM111111111MM111MMM11111111MM111111111111
111MM1111111MM111MM111111111MM111111111MM1111111111MMM1MM111111111MM11111MMM111111MM111111111111
11111MMMMMMMMM111MM111111111MM1111111MMMMMM1111111111MMMM111111111MM111111MMMM1111MMMMMMMMMMMM11
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1MM1111111111MM11MMM111111111MM111111MMMMMM111111MMMMMMMMMMM111111111MMMMMM111111MMMMMMMMMMM1111
1MMMM111111MMMM11MMMM11111111MM1111MMM1111MMM1111MM111111111MM11111MMM1111MMM1111MM111111111MM11
1MM1MM1111MM1MM11MM1MM1111111MM111MMM111111MMM111MM1111111111MM111MMM111111MMM111MM1111111111MM1
1MM11MMMMM111MM11MM11MM111111MM11MM1111111111MM11MM111111111MM111MM1111111111MM11MM111111111MM11
1MM1111M11111MM11MM1111MM1111MM111MMM111111MMM111MMMMMMMMMMM111111MMM1MMMM1MMM111MMMMMMMMMMM1111
1MM1111111111MM11MM111111MMM1MM1111MMM1111MMM1111MM1111111111111111MMM11MMMMM1111MM11111111MM111
1MM1111111111MM11MM11111111MMMM111111MMMMMM111111MM1111111111111111111MMMM1MMMM11MM111111111MMM1
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111MMMMMMMM111111MMMMMMMMMMMM111MM1111111111MM11MMMM111111MMMM11MM1111111111MM111MMM111111MMM11
111MM1111111MM1111MMMMMMMMMMMM111MM1111111111MM111MMM111111MMM111MM1111111111MM1111MMM1111MMM111
11MMM1111111MMM11111111MM11111111MM1111111111MM111MMM111111MMM1111MM111MM111MM111111MMM11MMM1111
1111MMMMM11111111111111MM11111111MM1111111111MM1111MMM1111MMM11111MM111MM111MM11111111MMMM111111
1MMM111MMMM111111111111MM11111111MMM11111111MMM11111MMM11MMM111111MM111MM111MM111111MMM11MMM1111
111MMM11111MMM111111111MM11111111MMM11111111MMM111111MM11MM1111111MM1MM11MM1MM11111MMM1111MMM111
11111MMMMMMM11111111111MM1111111111MMMMMMMMMM111111111MMMM111111111MMM1111MMM11111MMM111111MMM11
7 32
11MMM111111MMM11111MMMMMMMMMM111
111MMM1111MMM1111111111111MM1111
1111MMM11MMM1111111111111MM11111
111111MMMM11111111111111MM111111
1111111MM1111111111111MM11111111
1111111MM111111111111MM111111111
1111111MM1111111111MMMMMMMMMMM11
7 16
1MMMMMMMMMMM1111
1MM111111111MM11
1MM1111111111MM1
1MM1111111111MM1
1MM1111111111MM1
1MM111111111MM11
1MMMMMMMMMMM1111
7 16
1MM1111111111MM1
1MM1111111111MM1
11MM111MM111MM11
11MM111MM111MM11
11MM111MM111MM11
11MM1MM11MM1MM11
111MMM1111MMM111
C艹代码:
#include <stdio.h>
#include <string.h>
#define MAX 1100
int n,m;
char mmap[MAX][MAX];
char str[MAX][MAX] = {
"111111MMM1111111",
"11111MM1MM111111",
"1111MM111MM11111",
"111MMMMMMMMM1111",
"11MM1111111MM111",
"1MMM11111111MM11",
"1MM1111111111MM1",
"1MMMMMMMMMMM1111",
"1MM11111111MM111",
"1MM11111111MM111",
"1MMMMMMMMMMM1111",
"1MM11111111MM111",
"1MM11111111MM111",
"1MMMMMMMMMMM1111",
"11111MMMMMMMM111",
"111MM1111111MM11",
"11MM111111111MM1",
"11MM111111111111",
"11MM111111111MM1",
"111MM1111111MM11",
"11111MMMMMMMM111",
"1MMMMMMMMMMM1111",
"1MM111111111MM11",
"1MM1111111111MM1",
"1MM1111111111MM1",
"1MM1111111111MM1",
"1MM111111111MM11",
"1MMMMMMMMMMM1111",
"1MMMMMMMMMMMM111",
"1MM1111111111111",
"1MM1111111111111",
"1MMMMMMMMMMMM111",
"1MM1111111111111",
"1MM1111111111111",
"1MMMMMMMMMMMM111",
"1MMMMMMMMMMMMM11",
"1MM1111111111111",
"1MM1111111111111",
"1MMMMMMMMMMMMM11",
"1MM1111111111111",
"1MM1111111111111",
"1MM1111111111111",
"11111MMMMMMMM111",
"111MM1111111MM11",
"11MM111111111MM1",
"11MM111111111111",
"11MM111111MMMMM1",
"111MM1111111MM11",
"11111MMMMMMMMM11",
"1MM111111111MM11",
"1MM111111111MM11",
"1MM111111111MM11",
"1MMMMMMMMMMMMM11",
"1MM111111111MM11",
"1MM111111111MM11",
"1MM111111111MM11",
"11111MMMMMM11111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"11111MMMMMM11111",
"1111MMMMMMMM1111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"111MM11MM1111111",
"111MMM1MM1111111",
"11111MMMM1111111",
"11MM111111MMM111",
"11MM11111MMM1111",
"11MM111MMM111111",
"11MMMMM111111111",
"11MM111MMM111111",
"11MM11111MMM1111",
"11MM111111MMMM11",
"11MM111111111111",
"11MM111111111111",
"11MM111111111111",
"11MM111111111111",
"11MM111111111111",
"11MM111111111111",
"11MMMMMMMMMMMM11",
"1MM1111111111MM1",
"1MMMM111111MMMM1",
"1MM1MM1111MM1MM1",
"1MM11MMMMM111MM1",
"1MM1111M11111MM1",
"1MM1111111111MM1",
"1MM1111111111MM1",
"1MMM111111111MM1",
"1MMMM11111111MM1",
"1MM1MM1111111MM1",
"1MM11MM111111MM1",
"1MM1111MM1111MM1",
"1MM111111MMM1MM1",
"1MM11111111MMMM1",
"11111MMMMMM11111",
"111MMM1111MMM111",
"11MMM111111MMM11",
"1MM1111111111MM1",
"11MMM111111MMM11",
"111MMM1111MMM111",
"11111MMMMMM11111",
"1MMMMMMMMMMM1111",
"1MM111111111MM11",
"1MM1111111111MM1",
"1MM111111111MM11",
"1MMMMMMMMMMM1111",
"1MM1111111111111",
"1MM1111111111111",
"11111MMMMMM11111",
"111MMM1111MMM111",
"11MMM111111MMM11",
"1MM1111111111MM1",
"11MMM1MMMM1MMM11",
"111MMM11MMMMM111",
"111111MMMM1MMMM1",
"1MMMMMMMMMMM1111",
"1MM111111111MM11",
"1MM1111111111MM1",
"1MM111111111MM11",
"1MMMMMMMMMMM1111",
"1MM11111111MM111",
"1MM111111111MMM1",
"1111MMMMMMMM1111",
"111MM1111111MM11",
"11MMM1111111MMM1",
"1111MMMMM1111111",
"1MMM111MMMM11111",
"111MMM11111MMM11",
"11111MMMMMMM1111",
"11MMMMMMMMMMMM11",
"11MMMMMMMMMMMM11",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"1MM1111111111MM1",
"1MM1111111111MM1",
"1MM1111111111MM1",
"1MM1111111111MM1",
"1MMM11111111MMM1",
"1MMM11111111MMM1",
"111MMMMMMMMMM111",
"1MMMM111111MMMM1",
"11MMM111111MMM11",
"11MMM111111MMM11",
"111MMM1111MMM111",
"1111MMM11MMM1111",
"11111MM11MM11111",
"111111MMMM111111",
"1MM1111111111MM1",
"1MM1111111111MM1",
"11MM111MM111MM11",
"11MM111MM111MM11",
"11MM111MM111MM11",
"11MM1MM11MM1MM11",
"111MMM1111MMM111",
"11MMM111111MMM11",
"111MMM1111MMM111",
"1111MMM11MMM1111",
"111111MMMM111111",
"1111MMM11MMM1111",
"111MMM1111MMM111",
"11MMM111111MMM11",
"11MMM111111MMM11",
"111MMM1111MMM111",
"1111MMM11MMM1111",
"111111MMMM111111",
"1111111MM1111111",
"1111111MM1111111",
"1111111MM1111111",
"111MMMMMMMMMM111",
"1111111111MM1111",
"111111111MM11111",
"11111111MM111111",
"111111MM11111111",
"11111MM111111111",
"111MMMMMMMMMMM11",
};
int cnt[30] = {33,49,34,42,44,36,38,37,22,27,36,24,42,42,40,38,48,43,43,34,38,40,40,40,28,31};
int vis[MAX][MAX],sum,hash[30];
int dir[8][2] = {{1,0},{1,-1},{1,1},{-1,0},{-1,1},{-1,-1},{0,1},{0,-1}};
void Count(int x,int y) {
vis[x][y] = 1,sum++;
for (int k = 0; k < 8; ++k) {
int xx = x + dir[k][0];
int yy = y + dir[k][1];
if (mmap[xx][yy] == 'M' && vis[xx][yy] == 0)
Count(xx,yy);
}
}
int Isok(int x,int y,int sum) {
int i,j,cnt = 0;
for (i = x; vis[i][y]; ++i) cnt++;
for (i = x - 1; vis[i][y]; --i) cnt++;
if (cnt == sum) return 1;
cnt = 0;
for (i = y; vis[x][i]; ++i) cnt++;
for (i = y - 1; vis[x][i]; --i) cnt++;
if (cnt == sum) return 1;
return 0;
}
struct node {
int x,y;
}now,next,qu[MAX];
int ok[400][400];
int Check(int x,int y,int sum) {
int i,j,k;
int head,tail;
head = tail = 0;
memset(ok,0,sizeof(ok));
now.x = x,now.y = y;
qu[head++] = now;
while (tail < head) {
now = qu[tail++];
if (Isok(now.x,now.y,sum) == 1) return 1;
for (k = 0; k < 8; ++k) {
next.x = now.x + dir[k][0];
next.y = now.y + dir[k][1];
if (vis[next.x][next.y] && !ok[next.x][next.y])
qu[head++] = next,ok[next.x][next.y] = 1;
}
}
return 0;
}
int main() {
int i,j,k;
while (scanf("%d%d",&n,&m) != EOF) {
memset(vis,0,sizeof(vis));
memset(hash,0,sizeof(hash));
memset(mmap,'2',sizeof(mmap));
for (i = 1; i <= n; ++i)
scanf("%s",mmap[i]+1);
for (i = 1; i <= n; ++i)
for (j = 1; j <= m; ++j)
if (mmap[i][j] == 'M' && !vis[i][j]) {
sum = 0;
Count(i,j);
int temp = 0;
for (k = 0; k < 26; ++k)
if (sum == cnt[k]) temp++;
if (temp == 1) {
for (k = 0; k < 26; ++k)
if (sum == cnt[k]) hash[k] = 1;
}
else if (sum == 34) {
//c t
if (Check(i,j,12)) hash['t'-'a'] = 1;
else hash['c'-'a'] = 1;
}
else if (sum == 36) {
//f k
if (Check(i,j,5)) hash['k'-'a'] = 1;
else hash['f'-'a'] = 1;
}
else if (sum == 38) {
//g p u
if (Check(i,j,11)) hash['p'-'a'] = 1;
else if (Check(i,j,10)) hash['u'-'a'] = 1;
else hash['g'-'a'] = 1;
}
else if (sum == 40) {
// o v w x
if (Check(i,j,6)) {
if (!Check(i,j,5)) hash['o'-'a'] = 1;
else hash['w'-'a'] = 1;
}
else{
if (Check(i,j,6) != 1) {
if (Check(i,j,5)) hash['v'-'a'] = 1;
else hash['x'-'a'] = 1;
}
}
}
else if (sum == 42) {
//d m n
if (Check(i,j,4)) {
if (Check(i,j,3)) hash['n'-'a'] = 1;
else hash['m'-'a'] = 1;
}
else hash['d'-'a'] = 1;
}
else {//43
//r s
if (Check(i,j,11)) hash['r'-'a'] = 1;
else hash['s'-'a'] = 1;
}
}
for (i = 0; i < 26; ++i)
if (hash[i]) printf("%c",'A'+i);
printf("\n");
}
}
本文ZeroClock原创,但可以转载,因为我们是兄弟。