先说下题目的意思吧,就是F点表示着火点,然后会向周围扩撒火势,这是就要用到一次BFS。
然后J点表示触发点,只有走到宫格的边界才能出去。这是第二次的BFS
WA了好几次。后来才发现原来是我的第二次BFS出了一点问题。其中我有一个判断条件是这样的如果这点
小于火势达到的点数字,才能走。
还有一种情况没有考虑到,那就是这种情况。万一这一个点火势到不了,但是作者可以走,那就走不了这点,
改了这个地方就A。
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> #include<iostream> using namespace std; #define maxn 1000+10 char s[maxn][maxn]; int n,m; int xx[4]={0,0,1,-1},yy[4]={-1,1,0,0}; int d[maxn][maxn],cnt[maxn][maxn]; struct node { int x,y; }; node st,ed,t,tp; void bfs1() { queue<node> q1; memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(s[i][j]=='F') { st.x=i; st.y=j; q1.push(st); } } while(!q1.empty()) { t=q1.front(); // printf("%d %d::",t.x,t.y); q1.pop(); for(int i=0;i<4;i++) { tp.x=t.x+xx[i],tp.y=t.y+yy[i]; if(tp.x>=0&&tp.x<n&&tp.y>=0&&tp.y<m&&s[tp.x][tp.y]=='.'&&cnt[tp.x][tp.y]==0) { //printf("!%d %d !\n",tp.x,tp.y); q1.push(tp); cnt[tp.x][tp.y]=cnt[t.x][t.y]+1; } } } } int bfs2() { queue<node> q2; memset(d,0,sizeof(d)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(s[i][j]=='J') { st.x=i,st.y=j; break; } q2.push(st); while(!q2.empty()) { t=q2.front(); q2.pop(); if(t.x==0||t.x==n-1||t.y==0||t.y==m-1) { return d[t.x][t.y]; } for(int i=0;i<4;i++) { tp.x=t.x+xx[i],tp.y=t.y+yy[i]; if(tp.x>=0&&tp.y>=0&&tp.x<n&&tp.y<m) { if(s[tp.x][tp.y]=='.'&&(d[t.x][t.y]+1<cnt[tp.x][tp.y]||cnt[tp.x][tp.y]==0)&&d[tp.x][tp.y]==0) { q2.push(tp); d[tp.x][tp.y]=d[t.x][t.y]+1; } } } } return -1; } int main() { int tt; scanf("%d",&tt); while(tt--) { scanf("%d%d",&n,&m); getchar(); for(int i=0;i<n;i++) gets(s[i]); bfs1(); /*for(int i=0;i<n;i++) for(int j=0;j<m;j++) printf("%d%c",cnt[i][j],j==m-1?'\n':' ');*/ int kj=bfs2(); if(kj==-1) puts("IMPOSSIBLE"); else printf("%d\n",kj+1); } return 0; }