例题5-9 uva1952数据库

nice! 一遍A! 莫得看题解!
并查集多了,就总想着找爸爸,爸爸去哪了?
题意:就是给你一个n*m 的 数据库, n 行 m 列, 每列的数据用 , 隔开
然后问是否存在满足 (r1,c1)=(r2,c1) (r1,c2)=(r2,c2) (只要一组满足即可)
若存在 NO 及 r1,r2,c1,c2; 不存在 YES
想法: 先是把他行列分好 很随意的做就行了 (如代码)
后面我们来波一列一列的遍历,(说白就是循环 i,j 换位)
如果是第一次出现,则为爸爸,为 i+1 保存(若直接存 i 则第一个数会有大大的问题)
后面出现的(叫你来的晚) 只好认人为爸
就这么做完又有什么用呢?你会神奇的发现,所以列上相同的行之间都有了微妙的父子关系…
接下来 ,见证奇迹
再重新来一波一行一行的遍历, 如果此时有老爸,则问问其他列上的是否也有这个爸爸或者他们两个同时认了相同的人做爸爸 即 f[fa][z]==f[i][z] 有?完美一波 结束啦!
上代码

#include <bits/stdc++.h>
using namespace std;
string s[10005][15];
map<string,int> ba;
int f[10005][15],n,m,r1,r2,c1,c2; 
void find_ba()
{
	    for (int j = 0; j < m; j++)
		{
			ba.clear();
			for (int i = 0; i < n; i++)
			{
				string str = s[i][j];
				if(!ba[str]) 
				{
					ba[str] = i+1; f[i][j] = i+1;
				} //做自己的英雄 
				else  
				{
					f[i][j] = ba[str]; 
				}//认别人为老爸 
			}
		}
}
int xun_ba()
{
	for (int i = 0; i < n; i++)
	  for (int j = 0; j < m; j++)
	  {
	  		if(f[i][j] != i+1) // 有老爸 
	  		{
	  			int fa = f[i][j] - 1; //找爸爸时减去 
	  			for (int z = 0; z < m;z++)
	  			{
	  				if(z!=j && f[fa][z]==f[i][z])
	  				{
	  					r1 = fa+1; r2 = i+1;//输出又加回去 
	  					c1 = j+1; c2 = z+1;
						return 1; 
	  				}
	  			}
	  		}
	  }
	  return 0;
}
int main()
{
	while(scanf("%d%d",&n,&m)==2)
	{
		memset(f,0,sizeof(f)); //每次来个初始化 
		string str;
		getchar();  //换行符得读掉 
		for (int i = 0; i < n; i++)
		{
			int be = 0,end = 0,k;
			getline(cin,str); k = str.size();
			for (int j = 0; j < m;j++)
			{
				while(str[end]!=',' && end < k) end++;
				  int cha = end - be;
				   s[i][j] = str.substr(be,cha);
				     be = end+1; end++;
			}
		}  //初始化 
		find_ba();
		if(!xun_ba())  printf("YES\n");
		else printf("NO\n%d %d\n%d %d\n",r1,r2,c1,c2);
	}
	return 0;
}
发布了55 篇原创文章 · 获赞 1 · 访问量 2662

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/99891911
5-9