A题是搜索或者说是贪心多一点,不难只是编码起来要认真一点.
由于题目说 unique English LETTER,
所以,最多只有26块.那么我们可以有这样一种思路:
首先,我们找到一种规则,某块是否是\"最下面\",
我们从这块的每个位置每一列,向下搜索,如果没有遇到其他块,那么这块肯定是先下来的一块.
这样子,我们可以从A开始,找到所有\"最下面\"中,字母顺序靠前的,我们找到他,记录下他,然后把他从图中去掉,然后我们继续找,找到没有得找,我们就找到答案了.
是不是很容易拉,大家试试.
代码如下,写得不是很好.
#include<stdio.h>
int n,slen,x[1100],y[1100],books,link[1100],head,delx[1100],dely[1100],deln;
char m[100][30];
char book[1100],s[1100];
int check(int dep,int x,char s)
{
int i;
if(dep<0 || dep==n || x<0 || x==20) return 1;
if(m[dep][x]!=s) return 1;
delx[deln]=x;
dely[deln]=dep;
m[dep][x]=\'.\';
for (i=dep;i<n;i++)
if(m[x]==s) break;
else
if( m[x]!=\'.\')
{
m[dep][x]=s;
return 0;
}
if (check(dep+1,x,s)==0)
{
m[dep][x]=s;
return 0;
}
if (check(dep-1,x,s)==0)
{
m[dep][x]=s;
return 0;
}
if (check(dep,x+1,s)==0)
{
m[dep][x]=s;
return 0;
}
if (check(dep,x-1,s)==0)
{
m[dep][x]=s;
return 0;
}
return 1;
}
int dos(int dep)
{
int i,j,p,pp;
do
{
j=0;
for (i=0;i<slen;i++) if (link[s-65]>0)
{
if(m[y][x]!=\'.\')
{
deln=0;
if (check(y,x,s) ==1)
{
j++;
book[books++]=s;
link[s-65]=0;
break;
}else
{
for (j=0;j<deln;j++)
{
m[dely[j]][delx]=s;
}
}
}
}
}
while(j);
return 0;
}
int main()
{
int i,j,k;
freopen(\"in.txt\",\"r\",stdin);
while(scanf(\"%d\",&n)!=EOF)
{
getchar();
slen=0;
books=0;
for(i=0;i<26;i++) link=0;
for (i=0;i<n;i++)
{
scanf(\"%s\",m);
}
for (i=n-1;i>=0;i--)
for (j=0;j<20;j++) if(m[j]!=\'.\' && link[m[j]-65]==0)
{
//找到某一个块,记录下这个块的一个字符为止就行,link是一个帮助查询的数组
x[slen]=j;
y[slen]=i;
s[slen++]=m[j];
link[m[j]-65]=1;
}
for (i=0;i<slen;i++)
for (j=i+1;j<slen;j++)if(s[j]<s)
{
k=x;x=x[j];x[j]=k;
k=y;y=y[j];y[j]=k;
k=s;s=s[j];s[j]=k;
}
dos(n-1);
book[books]=0;
printf(\"%s\\n\",book);
}
return 0;
} |