解题思路:(吐槽:还是菜。弱爆了!咋办)最终的代码还是翻了翻题解思路才勉强A了,而且还是没预处理的方法A的,数据卡了点时间过的。而代码1我觉得理论上是比代码2来得快的,居然TLE了。代码2却过了。百思不得其解QAQ。做这种题要注意状态数组如何设置!我这边用vis表示走带x,y点找到几个人。记得至少要3维!!!然后0表示1个都没找到,1找到一个,2找到另一个,3都找到!TLE一早上 感觉没爱了QAQ。
代码1(TLE):
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
struct node
{
int x,y,step,sum;
};
int nex[4][2]={0,1,1,0,0,-1,-1,0},n,m,limt;
char image[110][110];
bool vis[110][110][4];
queue<node> Q;
bool pan(int x,int y)
{
if(x>=0 && x<n && y>=0 && y<m)
return false;
return true;
}
/*
int judge(int x,int y,int nexx,int nexy)
{
if(pan(x,y) || image[x][y]=='X')
return 0;
if(image[x][y]=='D')
return 1;
else if(image[x][y]=='E')
return 2;
judge(x+nexx,y+nexy);
return ;
}
*/
int judge(int x,int y)
{
int step=0,a,b,i;
for(i=0;i<4;i++)
{
a=x+nex[i][0];
b=y+nex[i][1];
while(!pan(a,b) && image[a][b]=='.')
{
a+=nex[i][0];
b+=nex[i][1];
}
if(!pan(a,b))
{
if(image[a][b]=='D')
step+=1;
else if(image[a][b]=='E')
step+=2;
}
}
return step;
}
int bfs(int x,int y)
{
node now,xia;
int i;
while(!Q.empty())
Q.pop();
now.sum=judge(x,y);
now.x=x;now.y=y;now.step=0;
vis[now.x][now.y][now.sum]=true;
Q.push(now);
while(!Q.empty())
{
now=Q.front();
Q.pop();
// if(now.step>limt)
// return -1;
if(now.sum==3)
return now.step;
for(i=0;i<4;i++)
{
xia.x=now.x+nex[i][0];
xia.y=now.y+nex[i][1];
if(pan(xia.x,xia.y) || image[xia.x][xia.y]!='.' ) //这边很关键!,兄弟躲的地方是不能走过去的
continue;
xia.sum=judge(xia.x,xia.y); //a b 这点可以找到几个人
if(xia.sum!=now.sum)
{
xia.sum+=now.sum;
if(xia.sum>3) xia.sum=3;
}
if(vis[xia.x][xia.y][xia.sum]) //到达同一点情况相同也筛掉
continue;
xia.step=now.step+1;
if(xia.step>limt)
continue;
vis[xia.x][xia.y][xia.sum]=true;
Q.push(xia);
}
}
return -1;
}
int main()
{
int t,i,j,k,x,y,flag;
cin>>t;
for(k=1;k<=t;k++)
{
memset(vis,false,sizeof(vis));
scanf("%d%d%d",&n,&m,&limt);
getchar();
for(i=flag=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&image[i][j]);
if(!flag && image[i][j]=='S')
x=i,y=j,flag=1;
}
getchar();
}
printf("Case %d:\n%d\n",k,bfs(x,y));
}
return 0;
}
代码2(AC): #include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
struct node
{
int x,y,step,sum;
};
int nex[4][2]={0,1,1,0,0,-1,-1,0},n,m,limt;
char image[110][110];
bool vis[110][110][4];
queue<node> Q;
bool pan(int x,int y)
{
if(x>=0 && x<n && y>=0 && y<m)
return false;
return true;
}
int judge(int x,int y)
{
int step=0,a,b,i;
for(i=0;i<4;i++)
{
a=x+nex[i][0];
b=y+nex[i][1];
while(!pan(a,b) && image[a][b]=='.')
{
a+=nex[i][0];
b+=nex[i][1];
}
if(!pan(a,b))
{
if(image[a][b]=='D')
step+=1;
else if(image[a][b]=='E')
step+=2;
}
}
return step;
}
int bfs(int x,int y)
{
node now,xia;
int i;
while(!Q.empty())
Q.pop();
now.sum=judge(x,y);
now.x=x;now.y=y;now.step=0;
vis[now.x][now.y][now.sum]=true;
Q.push(now);
while(!Q.empty())
{
now=Q.front();
Q.pop();
// if(now.step>limt)
// return -1;
if(now.sum==3)
return now.step;
for(i=0;i<4;i++)
{
xia.x=now.x+nex[i][0];
xia.y=now.y+nex[i][1];
xia.sum=judge(xia.x,xia.y); //a b 这点可以找到几个人
if(xia.sum!=now.sum)
{
xia.sum+=now.sum;
if(xia.sum>3) xia.sum=3;
}
if(pan(xia.x,xia.y) || image[xia.x][xia.y]!='.' || vis[xia.x][xia.y][xia.sum]) //这边很关键!,兄弟躲的地方是不能走过去的
continue;
xia.step=now.step+1;
if(now.step+1>limt) //到达同一点情况相同也筛掉
continue;
vis[xia.x][xia.y][xia.sum]=true;
Q.push(xia);
}
}
return -1;
}
int main()
{
int t,i,j,k,x,y,flag;
cin>>t;
for(k=1;k<=t;k++)
{
memset(vis,false,sizeof(vis));
scanf("%d%d%d",&n,&m,&limt);
getchar();
for(i=flag=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&image[i][j]);
if(!flag && image[i][j]=='S')
x=i,y=j,flag=1;
}
getchar();
}
printf("Case %d:\n%d\n",k,bfs(x,y));
}
return 0;
}