Light OJ 1066(bfs+坑)

来源:互联网 发布:有域名还需要什么 编辑:程序博客网 时间:2024/05/18 01:00

   咋一看就是一个裸的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;}



0 0
原创粉丝点击