今天只写了一道题,还有一道题我感觉代码逻辑上没有问题,自己试了好几组样例都很合理,就是提交的时候死活不过,没有一组是AC,耗了半天时间。
![](https://i-blog.csdnimg.cn/blog_migrate/1fd69d7a72aa2335d40cdc21ac8ded1e.png)
读入的时候,将即将被砸到的格子标记为时间,其他地方标记为-1,这样我们就要在最短的时间找到‘-1’,再搜寻下一格时,要保证t<t'-1,这样才可入列
#include<stdio.h>
int a[310][310],xy[2][5]={-1,0,1,0,0,0,1,0,-1,0};
int m,t,x,y,num,flag,ans=-1;
int c[100000][3];
int head,tail=1;
int main()
{
scanf("%d",&m);
for(int i=0;i<=301;i++)
for(int j=0;j<=301;j++)
{
a[i][j]=-1;
}
while(m--)
{
scanf("%d %d %d",&x,&y,&t);
for(int i=0;i<5;i++)
{
num=a[x+xy[0][i]][y+xy[1][i]];
if(num==-1) a[x+xy[0][i]][y+xy[1][i]]=t;
else if(num>=t) a[x+xy[0][i]][y+xy[1][i]]=t;
}
}
while(head<tail)
{
for(int i=0;i<=4;i++)
{
x=c[head][0]+xy[0][i];
y=c[head][1]+xy[1][i];
if(x<0||y<0) continue;
if(a[x][y]==-1)
{
flag=1;
ans=c[head][2]+1;
break;
}
else
{
if(c[head][2]<a[x][y]-1)
{
c[tail][0]=x;
c[tail][1]=y;
c[tail][2]=c[head][2]+1;
a[x][y]=0;
tail++;
}
}
}
if(flag==1) break;
head++;
}
/*for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++) printf("%d ",a[i][j]);
printf("\n");
}*/
printf("%d",ans);
return 0;
}
这是第二题(代码是错的)讲讲思路;
这题看完第一遍就觉得应该是用回溯法实现,因为我本人处理字符串比较少,所以一开始头很大,但是有一点很明确,就是要实现两个单词的接龙函数,写出代码后有种豁然开朗的感觉,接下来套dfs就行了,在我调试好代码后,居然全WA了😐,接下来半天也没找出错误。
![](https://i-blog.csdnimg.cn/blog_migrate/0968424f3a06fddb322f9c92064c8dad.png)
代码(错误)
#include<stdio.h>
#include<string.h>
char a[22][1000];
int b[22];
int m,ans=1;
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int re(char x[],char y[])
{
int l,flag;
l=min(strlen(x),strlen(y));
for(int i=1;i<l;i++)
{
flag=0;
for(int j=i;j>=1;j--)
{
if(x[strlen(x)-j]!=y[i-j]) flag=1;
}
if(flag==0)
{
return i;
}
else
{
continue;
}
}
return 0;
}
void dfs(char x[],int llen)
{
int len;
ans=max(ans,llen);
for(int i=0;i<m;i++)
{
if(b[i]>=2) continue;
len=re(x,a[i]);
if(len==0) continue;
else if(b[i]<2)
{
b[i]++;
dfs(a[i],llen+strlen(a[i])-len);
b[i]--;
}
}
}
int main()
{
int sum=0,q=0;
char c;
scanf("%d\n",&m);
for(int i=0;i<m;i++)
{
scanf("%s",&a[i]);
}
getchar();
scanf("%c",&c);
for(int i=0;i<m;i++)
{
if(a[i][0]==c)
{
b[i]++;
q=1;
dfs(a[i],strlen(a[i]));
b[i]--;
}
}
printf("%d",q==1?ans:1);
return 0;
}
用函数判断两个单词重叠长度(最小长度),如果没有就返回0,如果有返回重叠长度,如果上一个单词与下一个重叠部分大于0,那么可以接龙,进行dfs,一个单词只能用两次,用数组b[i],储存a[i]用过的次数。