uva 1592 Database

题意:求一个矩形类似于田字行,使得左边的上下两行的内容一样,右边的内容一样。暴力4个循环不可行,运用map,先行遍历再列遍历,运用map<pair<int,int>,int>

。具体看代码把。

#include <iostream>
#include <map>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using namespace std;
const int Max =100000;

map<string,int> mp;
map<int,int> mp1;
map<pair<int,int>,int> sum;
int map_int[10010][100];

int main()
{
	int n,m;
	while (cin >> n >> m){
	getchar(); 
	char str[1000];	
	
	int num=0;
	for(int i=0;i<n;i++)
	{
		gets(str);
		string sstr;
		int num1=0;
		for(int z=0;;z++)
		{
			if(str[z]==','||str[z]=='\0')
			{
				if(!mp.count(sstr))
				{
					mp[sstr]=num;
					map_int[i][num1]=num;
					num1++;
					num++;
				}
				else
				{
					map_int[i][num1]=mp[sstr];
					num1++;
				}
				sstr.clear();
				if(str[z]=='\0')
					break;
			}
			else
			{
				sstr.push_back(str[z]);
			}
		}	
	}
/*for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
			cout<<map_int[i][j]<<" ";
		cout<<endl; 
	}
	*/
	int cont=0;
	int row=0;
	int col=0;
	int cont1=0;
	for(int i=0;i<m;i++)
	{
		if(cont1==1)
			break;
		for(int j=i+1;j<m;j++)
		{	
			if(cont1==1)
				break;
			mp1.clear();
			sum.clear();
			for(int z=0;z<n;z++)
			{
				
				if(sum.count(make_pair(map_int[z][i],map_int[z][j])))
				{
					cont=1;
					cout<<"NO"<<endl;
					cout<<sum[make_pair(map_int[z][i],map_int[z][j])]<<" "<<z+1<<endl;
					cout<<i+1<<" "<<j+1<<endl;
					cont1=1;
					break;	
				}
				else
				{
					mp1[map_int[z][i]]=map_int[z][j];
					sum[make_pair(map_int[z][i],map_int[z][j])]=z+1;
				}
			}
	
		}
	}
	if(cont==0)
		printf("YES\n");
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/leekerian/article/details/80275048