o0Roy的博客

while(!Success) { Try(); }

POJ 3923 Ugly Windows 解题报告

原题链接:http://poj.org/problem?id=3923

题目大意:求出窗体是在顶部的窗体,并输出其代号。

思路:通过遍历找出所有出现的字母,然后对每一个字母进行判断是否是顶部窗口(求出所有该字母的坐标中最大XY,最小XY,进而求出最大的长和宽,算出个数,再与出现的个数进行比较,如果相等,最后还需判断中间是否有字母,可以用isupper来判断),最后输出顶部窗口的字母

源代码:

#include"iostream"
#include"vector"
using namespace std;
const int max_len = 999;
const int max_num = 999;
char win[max_len][max_len];
int ch[26],ch_len;
struct index
{
	int x,y;
};
vector<index> vec;
int n,m,i,j;
void count()
{
	ch_len = 0;
	memset(ch,0,sizeof(ch));
	for(i = 0;i < n;i++)
	{
		for(j = 0;j < m;j++)
		{
			if(win[i][j] != '.' && ch[win[i][j] - 'A'] == 0)
				ch[win[i][j] - 'A'] = 1;
		}
	}
}
void work()
{
	char k;
	for(k = 'A';k <= 'Z';k++)
	{
		if(ch[k - 'A'] == 0)//对有出现的字母进行判断
			continue;
		vec.clear();//每次判断应该清空容器
		for(i = 0;i < n;i++)//将所有的字母的坐标放入容器
		{
			for(j = 0;j < m;j++)
			{
				if(k == win[i][j])
				{
					index t;
					t.x = i;
					t.y = j;
					vec.push_back(t);
				}
			}
		}
		int min_x = max_num,min_y = max_num,max_x = 0,max_y = 0;
		for(i = 0;i < vec.size();i++)
		{//找出坐标中最大的X,Y,最小的x,y最后相减可以得到最大长和宽
			int x = vec[i].x;
			int y = vec[i].y;
			if(x < min_x)
				min_x = x;
			if(y < min_y)
				min_y = y;
			if(x > max_x)
				max_x = x;
			if(y > max_y)
				max_y = y;
		}
		//1.容器标个数与坐标算出的个数是否一致 || 2 和 3 (2 * 2的窗体不考虑) || 3.容器如果为空 
		//符合以上条件结束判断
		if((((max_x - min_x)+(max_y - min_y)) * 2 != vec.size()) || (max_x - min_x) == 1 || (max_y - max_y) == 1 || vec.size() == 0)
			continue;
		bool flag = true;//如果是一个完整的窗体,对其内部进行判断
		for(i = min_x + 1;i < max_x - 1;i++)
		{
			for(j = min_y + 1;j < max_y - 1;j++)
				if(isupper(win[i][j]))//对窗体内部进行判断 如果窗体是在顶部 内部应该是点 而不应有字母
					flag = false;
		}
		if(flag)
			cout << k;//输出顶部窗体代号
	}
}
int main()
{
	while(cin >> n >> m)
	{
		if(m == 0 &&n == 0)
			break;
		memset(ch,0,sizeof(ch));
		for(i = 0 ;i < n;i++)
		{
			for(j = 0 ;j < m;j++)
			{
				cin >> win[i][j];
			}
		}
		count();//判断有几个字母
		work();	//找出窗体并输出
		cout << endl;
	}
	return 0;
}




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/o0Roy/article/details/52383352
个人分类: POJ
想对作者说点什么? 我来说一句

poj 3414解题报告

2010年04月02日 8KB 下载

poj 3083解题报告

2010年04月02日 8KB 下载

poj 2329解题报告

2010年04月02日 5KB 下载

poj 1012解题报告

2010年04月02日 3KB 下载

poj 1659解题报告

2010年04月07日 4KB 下载

poj 3720解题报告

2010年04月07日 2KB 下载

poj 1440解题报告

2011年05月29日 602B 下载

没有更多推荐了,返回首页

不良信息举报

POJ 3923 Ugly Windows 解题报告

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭