做搜索题一定要细心,写错一个就很难出来了,教训啊!
#include <iostream>
#include <cstdio>
#include <map>
#include <queue>
#include <cstdio>
#include <algoritHm>
#include <cstring>
#include <string>
#include <cmath>
#define INF 0x3f3f3f
using namespace std;
char Map[60][60];
int dis[60][60];
bool used[60][60];
bool vis[60];
int step[60][60];
int W,H,TIME,Cnt;
int money[60];
queue<int> q;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sum;
int result;//记录终点处的钱
bool isGO(int x,int y)
{
if(x<1 || x>H || y<1 || y>W)
return false;
if('*'==Map[x][y])
return false;
return true;
}
//s表示的是第几个元素,@是第0个元素,<是第Cnt+1个元素,中间的是Cnt个宝藏
//dis[s][i]表示的就是0 1 2 3 i Cnt+1个元素到第s个元素的距离
void bfs(int x,int y,int s)
{
while(!q.empty()) q.pop();
memset(step,0,sizeof(step));
memset(used,false,sizeof(used));
int i,j;
//这个用在二维数组中整体的位置也是很骚的,直接代替了结构体
q.push((x-1)*W+y);
dis[s][s]=0;
used[x][y]=true;
step[x][y]=0;
while(!q.empty())
{
int temp=q.front();
q.pop();
y=temp%W;
if(0==y){
x=temp/W;
y=W;
}else
x=temp/W+1;
for(i=0;i<4;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(nx<1||nx>H||ny<1||ny>W)continue;
if(used[nx][ny]||Map[nx][ny]=='*')continue;
used[nx][ny]=true;
step[nx][ny]=step[x][y]+1;
q.push((nx-1)*W+ny);
if('.'==Map[nx][ny]) continue;
else if('@'==Map[nx][ny]) dis[s][0]=step[nx][ny];
else if('<'==Map[nx][ny]) dis[s][Cnt+1]=step[nx][ny];
else dis[s][Map[nx][ny]-'A'+1]=step[nx][ny];
}
}
}
void dfs(int s,int time,int value)
{
if(time>TIME) return;
if(result==sum) return;//不加这个可以试一下,会超时,我没有想到这个
if(Cnt<s){
result=max(result,value);
return;
}
for(int i=0;i<=Cnt+1;i++){
if(0==dis[s][i] || vis[i]) continue;
vis[i]=true;
dfs(i,time+dis[s][i],value+money[i]);
vis[i]=false;
}
}
int main()
{
int T,k;
cin >> T;
for(k=1;k<=T;k++)
{
memset(dis,0,sizeof(dis));
cin >> W >> H >> TIME >> Cnt;
int i,j;
sum=0;
for(i=1;i<=Cnt;i++){
scanf("%d",&money[i]);
sum+=money[i];
}
money[0]=0;money[Cnt+1]=0;//因为看了大神的题解,这一点注意到了
getchar();
for(i=1;i<=H;i++){
for(j=1;j<=W;j++){
scanf("%c",&Map[i][j]);
}
getchar();
}
for(i=1;i<=H;i++){//bfs将dis表打出来
for(j=1;j<=W;j++){
if('*'==Map[i][j]||'.'==Map[i][j]) continue;
else if('@'==Map[i][j]) bfs(i,j,0);
else if('<'==Map[i][j]) bfs(i,j,Cnt+1);
else bfs(i,j,Map[i][j]-'A'+1);
}
}
result=-1000;
memset(vis,false,sizeof(vis));
vis[0]=true;
dfs(0,0,0);//然后开始深搜
cout << "Case " << k << ':' << endl;
if(result<0)
printf("Impoosible\n");
else
printf("The best score is %d.\n",result);
if(k!=T) printf("\n");
};
return 0;
}