题目: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),假定确定了行,往下遍历,通过第一个不在此行上的点可以确定列,之后就继续遍历,看看是否都在确定的行或列上,假定确定了列,同理找行;