Question:题目详情(http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1005&cid=729)
题目大意:这是一道连连看的题,只能消掉最多拐弯两次的两个物体,只需找到一对即可
解题思路:遍历四边,看有没有相同的,再遍历中间部分的有没有两个相邻相同的即可,虽然我写的比较复杂,但总体来说过得了,没什么问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int a[35][35],b[10005];
int main()
{
int T,n,m,ncase=0;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>a[i][j];
}
int flag=0;
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++) //遍历上边
{
if(!b[a[1][i]])
b[a[1][i]]=1;
else {flag=1;break;}
}
if(flag==1)
{
printf("Case #%d: Yes\n",++ncase);
continue;
}
flag=0;
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++) //遍历下边
{
if(!b[a[n][i]])
b[a[n][i]]=1;
else {flag=1;break;}
}
if(flag==1)
{
printf("Case #%d: Yes\n",++ncase);
continue;
}
flag=0;
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++) //遍历右边
{
if(!b[a[i][m]])
b[a[i][m]]=1;
else {flag=1;break;}
}
if(flag==1)
{
printf("Case #%d: Yes\n",++ncase);
continue;
}
flag=0;
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++) //遍历左边
{
if(!b[a[i][1]])
b[a[i][1]]=1;
else {flag=1;break;}
}
if(flag==1)
{
printf("Case #%d: Yes\n",++ncase);
continue;
}
flag=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i+1<=n&&a[i+1][j]==a[i][j]) //只需要找到这个点的下边和右边
{flag=1;break;}
if(j+1<=m&&a[i][j+1]==a[i][j])
{flag=1;break;}
}
if(flag==1)
break;
}
if(flag==1)
printf("Case #%d: Yes\n",++ncase);
else printf("Case #%d: No\n",++ncase);
}
return 0;
}
这道题数据范围不是很大,纯暴力也没有问题