版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miranda_ymz/article/details/82936662
分类:搜索
2018TYUT秋季ACM模拟赛(14)2016CCPC东北地区
题意:连连看,问给出的局面中是否可以消去一对。
思路:边界消得情况,里面两个相连消得情况,分类看一下,找到变break输出
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int map[33][33];
int a[4][33];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool f(int s[],int n)
{
for(int i=0;i<n-1;i++)
if(s[i]==s[i+1]) return 1;
return 0;
}
int main()
{
int t,kcase=0;
int n,m;
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(i==0) a[0][j]=map[i][j];
if(i==n-1) a[1][j]=map[i][j];
if(j==0) a[2][i]=map[i][j];
if(j==m-1) a[3][i]=map[i][j];
}
sort(a[0],a[0]+m);
sort(a[1],a[1]+m);
sort(a[2],a[2]+n);
sort(a[3],a[3]+n);
int flag=0;
if(f(a[0],m)) flag=1;
else if(f(a[1],m)) flag=1;
else if(f(a[2],n)) flag=1;
else if(f(a[3],n)) flag=1;
//cout<<flag<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int center=map[i][j];
for(int k=0;k<4;k++)
{
int ux=i+dx[k];
int uy=j+dy[k];
if(ux<0||uy<0||ux>=n||uy>=m) continue;
if(map[ux][uy]==center)
{
flag=1;
break;
}
}
if(flag) break;
}
if(flag) break;
}
//cout<<flag<<endl;
printf("Case #%d: ",++kcase);
if(flag) printf("Yes\n");
else printf("No\n");
}
}