Zoj 3314 CAPTCHA (模拟)

题目链接: 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原创,但可以转载,因为我们是兄弟。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值