Code forces 699B

题目:http://codeforces.com/problemset/problem/699/B

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct where
{
	int x,y;
}index[1000005];
int cmpx(where u,where v)
{
	return u.x>v.x;
}
int cmpy(where u,where v)
{
	return u.y>v.y;
}
int main()
{
	int t,i,j,a,b,c,n,m;
	char ch[1005][1005];
	int tx,ty,quex[2],quey[2],flog=1;
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		getchar();
		tx=ty=0;
		t=0;
		flog=1;
		for(i=0;i<n;i++)
		{
			scanf("%s",ch[i]);
		}
		for(i=0;i<n;i++)//rug
		for(j=0;j<m;j++)
		{
			if(ch[i][j]=='*')
			{
				index[t].x=i;
				index[t++].y=j;
			}
		}
		if(t>(n+m-1))
		printf("NO\n\n");
		else if(t==2)
		{
			printf("YES\n%d %d\n\n",index[0].x+1,index[1].y+1);
		}
		else if(t==1)
		printf("YES\n%d %d\n\n",index[0].x+1,index[0].y+1);
		else if(t==0)
		printf("YES\n1 1\n\n");
		else
		{
			sort(index,index+3,cmpx);
			if(index[0].x==index[1].x)
			quex[tx++]=index[0].x;
			else if(index[1].x==index[2].x)
			quex[tx++]=index[1].x;
			else
			{
				sort(index,index+3,cmpy);
				if(index[0].y==index[1].y)
				quey[ty++]=index[0].y;
				else if(index[1].y==index[2].y)
				quey[ty++]=index[1].y;
			}
			if(tx!=0)
				{
					for(i=0;i<t;i++)
					{
					if(index[i].x==quex[0])
					continue;
					else
					{
						if(ty==0)
						quey[ty++]=index[i].y;
						else if(index[i].y==quey[0])
						continue;
						else
						{
							flog=0;
							break;
						}
			
					}
				}
				}
				else if(ty!=0)
				{
					for(i=0;i<t;i++)
					{
					if(index[i].y==quey[0])
					continue;
					else
					{
						if(tx==0)
						quex[tx++]=index[i].x;
						else if(index[i].x==quex[0])
						continue;
						else
						{
							flog=0;
							break;
						}
			
					}
					}
				}
				else
				flog=0;
				if(flog==0)
				printf("NO\n\n");
				else
				{
					printf("YES\n%d %d\n\n",quex[0]+1,quey[0]+1);
				}
				
			}
		
		}
		
	
}



思路:通过三个点的坐标可以至少确定一条行,或列,(如果确定不了,则NO),假定确定了行,往下遍历,通过第一个不在此行上的点可以确定列,之后就继续遍历,看看是否都在确定的行或列上,假定确定了列,同理找行;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值