题目还是很好做的,只要知道getline的重载,读入也不是很大的问题,用一个map把字符串映射到int上,或者自己写一个hash函数也可以,然后暴力枚举即可。
但是!用getline的时候我忘记一点啦!要把输入n和m之后的那个换行符弃掉!导致我WA了一个小时!诶!
反省反省。。。。。以下是代码
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int n,m,arr[10005][11];
string str;
map<string,int> ma;
bool judge(),checkrow(int r1,int r2,int c);
pair<int,int> row,col;
int main(){
ios_base::sync_with_stdio(false);
while(cin>>n>>m){
cin.get();//就是用这个cin.get把换行符弃掉,不然以下的读入全是错的,害得我找了一个小时的bug
for(int i=1;i<=n;++i){
for(int j=1;j<m;++j)
getline(cin,str,','),arr[i][j]=(ma.find(str)==ma.end())?(ma[str]=ma.size()+1):ma[str];
getline(cin,str),arr[i][m]=(ma.find(str)==ma.end())?(ma[str]=ma.size()+1):ma[str];
}
if(judge())
cout<<"YES\n";
else
cout<<"NO\n"<<row.first<<' '<<row.second<<endl<<col.first<<' '<<col.second<<endl;
ma.clear();
}
return 0;
}
bool judge(){
for(int i=1;i<m;++i)
for(int j=1;j<=n;++j)
for(int k=j+1;k<=n;++k)
if(arr[j][i]==arr[k][i]&&checkrow(j,k,i))
return false;
return true;
}
bool checkrow(int r1,int r2,int c){
for(int k=c+1;k<=m;++k)
if(arr[r1][k]==arr[r2][k]){
row.first=r1,row.second=r2,col.first=c,col.second=k;
return true;
}
return false;
}