昨天晚上UVA上不去今天晚上才上得去,这是在维护么?
然后去看了JAVA,感觉还不错昂~
晚上上去UVA后经常连接失败作死啊。
第一次做图的题~
基本是照着抄的T T
不过搞懂了图的BFS,虽然不像二叉树的BFS那么直观。
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000+24;
const int INF=9999999;
int R,C,jr,jc,d[MAXN][MAXN][2],ans;
bool vis[MAXN][MAXN][2];
char maze[MAXN][MAXN];
const int dir_r[4]={1,-1,0,0};
const int dir_c[4]={0,0,1,-1};
struct site
{
int r,c;
site(int i,int j): r(i),c(j){}
};
queue<site> Q;
void bfs(int kind)
{
while(!Q.empty())
{
int r=Q.front().r,c=Q.front().c;
Q.pop();
for(int i=0;i<4;i++)
{
int r_now=r+dir_r[i],c_now=c+dir_c[i];
if(r_now>=0 && r_now<R && c_now>=0 && c_now<C && maze[r_now][c_now] == '.' && vis[r_now][c_now][kind]==false)
{
Q.push(site(r_now,c_now));
vis[r_now][c_now][kind] = true;
d[r_now][c_now][kind] = d[r][c][kind] + 1;
}
}
}
}
void check(int r,int c)
{
if(maze[r][c]!='.' || vis[r][c][0]==false) return;
if( vis[r][c][1]==0 || d[r][c][0]<d[r][c][1] )
ans = min(ans, d[r][c][0] + 1);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis, 0, sizeof(vis));
memset(d, 0, sizeof(d));
vector<site> fire;
//input
scanf("%d%d",&R,&C);
for(int i=0;i<R;i++)
{
scanf("%s",maze[i]);
for(int j=0;j<C;j++)
{
if(maze[i][j]=='J'){ jr=i; jc=j; maze[i][j] = '.'; }
else if(maze[i][j]=='F') { fire.push_back(site(i,j)); maze[i][j] = '.'; }
}
}
//joe
vis[jr][jc][0]=true;
d[jr][jc][0]=0;
Q.push(site(jr,jc));
bfs(0);
//Fire;
for(int i=0;i<fire.size();i++)
{
vis[fire[i].r][fire[i].c][1] = true;
d[fire[i].r][fire[i].c][1] = 0;
Q.push(fire[i]);
}
bfs(1);
//answer
ans=INF;
for(int i=0;i<R;i++) { check(i,0);check(i,C-1); }
for(int i=0;i<C;i++) { check(0,i);check(R-1,i); }
if(ans == INF) printf("IMPOSSIBLE\n"); else printf("%d\n", ans);
}
}