时间限制: 2 Sec 内存限制: 10 MB
提交: 325 解决: 49
[提交][状态][讨论版]
题目描述
大家都玩过连连看吧!今天我们玩一个类似的游戏。在一个由10*10个小方格组成的矩形里有n(n<=10)对字符(它们是大写字符中的前n个)。矩形里有些位置是可以从上面走过,有些则不能。能走过的位置用'.'标识,不能的用'#'标识。如果2个相同字符是连通的(从一个字符能走到另一个字符,注意走的时候只能向上、下、左、右走。某个位置是有其他字符时,这个位置是不能走的),那么这对字符能够进行配对。如果将这对字符配对,这对字符将从这个矩形里消除,也就是说这2个字符所在的位置对于其他字符而言变成能走动了。
现在的问题是:请你决定这些字符的配对顺序(只有能配对才能进行配对),使得n对字符最后都配对成功。
输入
先给出一个正整数t(t<=10),表示有t组测试数据。
每组测试数据有10行组成,每行有10个字符。这些字符只能是'.','#',或者是大写字符中的前n个。每组测试数据中不超过10对字符。
输出
如果能够使每组测试数据中的n对字符配对成功,输出配对的顺序。如果有多种配对成功的顺序,输出字典序最小的那组。
否则输出"My God!"。
样例输入
2
ABF.......
CE........
D.........
..........
..........
..........
..........
.........D
........EC
.......FBA
ABF.......
CE........
D.........
..........
..........
.........#
........#D
.........#
........EC
.......FBA
样例输出
DCABEF
My God!
这道题告诉我们在数据量较大或计算次数较多时,STL会超时,超时,超时!!!
这道题T了6发,没想到是用了queue的缘故。。。
由于输出字典序,那么就会用到贪心.
#include<bits/stdc++.h>
using namespace std;
char g[12][12],a[12],b[12];
int vis[15],flag,v[15][15],xi,yi;
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
int x,y;
}q[100005];
struct nod
{
int x,y;
}s[100];
bool check(int x,int y,char ch)
{
if(x>=1&&x<=10&&y>=1&&y<=10&&!v[x][y]&&g[x][y]!='#')
{
if(g[x][y]!=ch&&g[x][y]!='.')
return false;
v[x][y]=1;
return true;
}
return false;
}
void bfs(char ch)
{
int L=0,R=1;
while(L<R)
{
int px=q[L].x,py=q[L].y;
L++;
if(g[px][py]==ch&&!v[px][py])
{
flag=0;
xi=px,yi=py;
return;
}
for(int i=0; i<4; i++)
{
int newx=px+dir[i][0];
int newy=py+dir[i][1];
if(!check(newx,newy,ch))
continue;
if(g[newx][newy]==ch)
{
flag=0;
xi=newx,yi=newy;
return;
}
q[R].x=newx,q[R].y=newy;
R++;
}
}
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
n=0;
memset(vis,0,sizeof(vis));
for(int i=1; i<=10; i++)
{
scanf("%s",g[i]+1);
for(int j=1; j<=10; j++)
{
if(!vis[g[i][j]-'A'+1]&&g[i][j]!='.'&&g[i][j]!='#')
{
a[n++]=g[i][j],vis[g[i][j]-'A'+1]=1;
s[g[i][j]-'A'].x=i;
s[g[i][j]-'A'].y=j;
}
}
}
memset(vis,0,sizeof(vis));
sort(a,a+n);
int k=0,m=0;
while(m<n)
{
flag=1;
m++;
for(int i=0; i<n&&flag; i++)
{
if(vis[a[i]-'A']) continue;
memset(v,0,sizeof(v));
q[0].x=s[a[i]-'A'].x;
q[0].y=s[a[i]-'A'].y;
v[s[a[i]-'A'].x][s[a[i]-'A'].y]=1;
bfs(a[i]);
if(!flag)
{
vis[a[i]-'A']=1;
b[k++]=a[i];
g[s[a[i]-'A'].x][s[a[i]-'A'].y]='.';
g[xi][yi]='.';
break;
}
}
}
if(k<n)
printf("My God!\n");
else
{
for(int i=0;i<n;i++) printf("%c",b[i]);
printf("\n");
}
}
}