咋一看就是一个裸的bfs,题目要求按字母顺序bfs;
WA了两次,主要有几个注意的地方。
1.准备去搜某个字母的时候,比他大的字母不能碰;
2.每次搜某个字母的时候,要重新把vis数组清0;
3.搜完字母后就应该把这个字母所在的位置改为empty grid,因为摘完了食物的地方可以走;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
char G[11][11];
bool vis[11][11];
int n;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct node{
int x,y,dis;
node(){}
node(int _x,int _y,int _dis):x(_x),y(_y),dis(_dis) {}
}ride[26];
int bfs(node st,char goal)
{
queue<node> q;
memset(vis,0,sizeof(vis));
vis[st.x][st.y]=1;
q.push(st);
while(!q.empty())
{
node now=q.front();
q.pop();
int nowx=now.x,nowy=now.y;
if(G[nowx][nowy]==goal) return now.dis;
for(int i=0;i<4;i++)
{
int tmpx=nowx+dx[i],tmpy=nowy+dy[i];
if(tmpx>=1&&tmpx<=n&&tmpy>=1&&tmpy<=n&&!vis[tmpx][tmpy]&&G[tmpx][tmpy]!='#')
{
if(G[tmpx][tmpy]!='.'&&G[tmpx][tmpy]!=goal) continue;
vis[tmpx][tmpy]=1;
q.push(node(tmpx,tmpy,now.dis+1));
}
}
}
return -1;
}
int main()
{
// freopen("in.txt","r",stdin);
int T,i,j,ca=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s",G[i]+1);
int cnt=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(G[i][j]>='A'&&G[i][j]<='Z')
{
int tot=G[i][j]-'A';
cnt++;
ride[tot].x=i,ride[tot].y=j,ride[tot].dis=0;
}
int ans=0;
bool ok=1;
for(int i=1;i<cnt;i++)
{
G[ride[i-1].x][ride[i-1].y]='.';
int tmp=bfs(ride[i-1],i+'A');
if(tmp==-1) {ok=0;break;}
else ans+=tmp;
}
if(ok) printf("Case %d: %d\n",++ca,ans);
else printf("Case %d: Impossible\n",++ca);
}
return 0;
}