分别用dfs, bfs做了一次
dfs超时,bfs超内存
题目意思 求解是否能够到达出口 如果能 求解到达时的最大携带价值
首先使用广搜搜出包括起点和终点在内 所有特殊点之间的最短距离 建立一个隐式图
然后使用DFS枚举各个组合 然后求出最大值 注意DFS的强剪
代码思想很好,但是代码风格让人看起来难受,改了半天还是这个样子,下次重写。
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
long value[20];
long Step[20][20];
char Map[60][60];
long W,H,L,M;
int stx, sty;
typedef struct
{
long mi,mj;
long step;
long from;
}Node;
queue<Node> q;
bool hs[60][60][20];
long dx[]={0,1,-1,0};
long dy[]={1,0,0,-1};
long b;
inline void BFS()
{
while (!q.empty())
{
q.pop();
}
memset(hs,0,sizeof(hs));
Node point;
point.mi = stx;
point.mj = sty;
point.from = 0;
point.step = 0;
q.push(point);
hs[point.mi][point.mj][point.from]=true;
while (!q.empty())
{
Node cur=q.front();
q.pop();
long j;
Node next;
for (j=0;j<4;++j)
{
next.mi=cur.mi+dx[j];
next.mj=cur.mj+dy[j];
next.step=cur.step+1;
next.from=cur.from;
if (next.mi>=0&&next.mi<H&&next.mj>=0&&next.mj<W)
{
if (next.step<=L&&!hs[next.mi][next.mj][next.from]&&Map[next.mi][next.mj]!='*')
{
hs[next.mi][next.mj][next.from]=true;
q.push(next);
if (Map[next.mi][next.mj]>='A'&&Map[next.mi][next.mj]<='J')
{
Step[next.from][Map[next.mi][next.mj]-'A'+2]=Step[Map[next.mi][next.mj]-'A'+2][next.from]=next.step;
next.from=Map[next.mi][next.mj]-'A'+2;
next.step=0;
hs[next.mi][next.mj][next.from]=true;
q.push(next);
}
else if (Map[next.mi][next.mj]=='@')
{
Step[next.from][0]=Step[0][next.from]=next.step;
next.from=0;
next.step=0;
hs[next.mi][next.mj][next.from]=true;
q.push(next);
}
else if (Map[next.mi][next.mj]=='<')
{
Step[next.from][1]=Step[1][next.from]=next.step;
next.from=1;
next.step=0;
hs[next.mi][next.mj][next.from]=true;
q.push(next);
}
}
}
}
}
}
bool vist[20];
long lmax;
long all;
inline void dfs(long pos,long now,long step)
{
if (lmax==all||step>L)
{
return;
}
if (Step[pos][1]!=-1&&step+Step[pos][1]<=L&&now>lmax)
{
lmax=now;
}
long i;
for (i=2;i<M+2;++i)
{
if (!vist[i]&&Step[pos][i]!=-1)
{
vist[i]=true;
dfs(i,now+value[i],step+Step[pos][i]);
vist[i]=false;
}
}
}
int main()
{
long T;
scanf("%ld",&T);
b=1;
while (T--)
{
scanf("%ld%ld%ld%ld",&W,&H,&L,&M);
long i,j;
all=0;
for (i=2;i<M+2;++i)
{
scanf("%ld",&value[i]);
all+=value[i];
}
value[0]=value[1]=0;
gets(Map[0]);
for (i=0;i<H;++i)
{
gets(Map[i]);
for (j=0;j<W;++j)
{
if (Map[i][j]=='@')
{
stx = i;
sty = j;
}
}
}
memset(Step,-1,sizeof(Step));
BFS();
if (b!=1)
puts("");
printf("Case %ld:\n",b++);
if (Step[0][1]==-1||Step[0][1]>L)
{
puts("Impossible");
continue;
}
memset(vist,0,sizeof(vist));
lmax=-1;
vist[0]=true;
dfs(0,0,0);
if (lmax!=-1)
printf("The best score is %ld.\n",lmax);
else
puts("Impossible");
}
return 0;
}