您的位置:首页 > 其它

hdu 4528 小明系列故事——捉迷藏

2015-04-11 14:47 357 查看
一开始很疑惑自己为什么错了,后来才知道原来这题是可以往回 走的.开4维visit数组记录状态,状态不同则往回走,相同再往回走.

1

30 31 95

S..............................

..X............................

...X...........................

....X..........................

.....X.........................

......X........................

.......X.......................

........X......................

.........X.....................

..........X....................

...........X...................

............X..................

.............X.................

..............X................

...............X...............

................X..............

.................X.............

..................X............

...................X...........

....................X..........

.....................X.........

......................X........

.......................X.......

........................X......

.........................X.....

..........................X....

...........................X...

............................X..

.............................XE

..............................D

结果是88,如果这组数据能过那就没问题了.

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m,t;
char mapp[105][105];
int visit[105][105][2][2];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dx,dy,ex,ey,sx,sy;
int re;
int flag1,flag2;
struct stu
{
int x,y,s;
int flag1,flag2;
};
int judgee(int x,int y)
{
int flag=0;
if(x==ex)
{
int nn=min(y,ey),mm=max(y,ey);
int sum=0;
for(int i=nn+1;i<mm;i++)
{
if(mapp[x][i]=='.') sum++;
}
if(sum==(mm-nn-1)) flag=1;
}
if(y==ey)
{
int nn=min(x,ex),mm=max(x,ex);
int sum=0;
for(int i=nn+1;i<mm;i++)
{
if(mapp[i][y]=='.') sum++;
}
if(sum==(mm-nn-1)) flag=1;
}
return flag;
}
int judged(int x,int y)
{
int flag=0;
if(x==dx)
{
int nn=min(y,dy),mm=max(y,dy);
int sum=0;
for(int i=nn+1;i<mm;i++)
{
if(mapp[x][i]=='.') sum++;
}
if(sum==(mm-nn-1)) flag=1;
}
if(y==dy)
{
int nn=min(x,dx),mm=max(x,dx);
int sum=0;
for(int i=nn+1;i<mm;i++)
{
if(mapp[i][y]=='.') sum++;
}
if(sum==(mm-nn-1)) flag=1;
}
return flag;
}
void bfs()
{
stu x,y;
queue<stu>root;
x.x=sx;x.y=sy;x.s=0;x.flag1=0;x.flag2=0;
root.push(x);
if(judgee(x.x,x.y)) x.flag1=1;
if(judged(x.x,x.y)) x.flag2=1;
visit[x.x][x.y][x.flag1][x.flag2]=1;
while(root.size())
{
x=root.front();
//cout<<x.x<<x.y<<endl;
if(judgee(x.x,x.y)) x.flag1=1;
if(judged(x.x,x.y)) x.flag2=1;
//cout<<x.x<<x.y<<x.flag1<<x.flag2<<endl;
if(x.flag1&&x.flag2) {re=x.s;return;}
root.pop();
for(int i=0;i<4;i++)
{
y.x=x.x+dir[i][0];
y.y=x.y+dir[i][1];
y.flag1=x.flag1;
y.flag2=x.flag2;
y.s=x.s+1;
if(y.x<0||y.x>=n||y.y<0||y.y>=m||visit[y.x][y.y][y.flag1][y.flag2]||mapp[y.x][y.y]!='.'||y.s>t){continue;}
root.push(y);
visit[y.x][y.y][y.flag1][y.flag2]=1;
}
}
}
int main()
{
int u,p;
cin>>u;
for(int p=0;p<u;p++)
{
cin>>n>>m>>t;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>mapp[i][j];
if(mapp[i][j]=='S') sx=i,sy=j;
if(mapp[i][j]=='E') ex=i,ey=j;
if(mapp[i][j]=='D') dx=i,dy=j;
// visit[i][j]=-1;
}
}
memset(visit,0,sizeof(visit));
mapp[sx][sy]='.';
re=-1;
bfs();
cout<<"Case "<<p+1<<":"<<endl;
cout<<re<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: