您的位置:首页 > 其它

2015轻院校赛 B 迷宫 (bfs)

2016-04-14 15:07 357 查看
http://acm.zznu.edu.cn/problem.php?id=1967

这套题的有毒 我交了好多遍才对

坑:机关要按照顺序走 并且在走这个机关之前不能走这个机关 但是能穿过这个机关 所以不能把机关刚开始设成墙

要设成其他符号

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>

using namespace std;
#define memset(a,b) memset(a,b,sizeof(a))
#define N 110

struct node
{
int x,y,step;
}e
;

char maps

;
int n,m;
int dis[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,1},{-1,1},{1,-1}};
int vis

;

int IF(int x,int y,int nx,int ny,int k)
{
if(maps[x][y]=='*' || maps[x][y]=='#' || x<0 || x>=n || y<0 || y>=m || vis[x][y]==1)
return 0;
if(k>=4)
{
if(k==4)
{
if(maps[x][y+1]=='#'&&maps[x+1][y]=='#')
return 0;
}
if(k==5)
{
if(maps[x][y-1]=='#' && maps[x-1][y]=='#')
return 0;
}
if(k==6)
{
if(maps[x][y-1]=='#' && maps[x+1][y]=='#')
return 0;
}
if(k==7)
{
if(maps[x][y+1]=='#' && maps[x-1][y]=='#')
return 0;
}
}
return 1;
}

int bfs(node s,node o)
{
memset(vis,0);
queue <node>Q;
Q.push(s);
vis[s.x][s.y]=1;
while(Q.size())
{
node p,q;
p=Q.front();
Q.pop();
if(p.x==o.x && p.y==o.y)
return p.step;
for(int i=0;i<=7;i++)
{
q.x=p.x+dis[i][0];
q.y=p.y+dis[i][1];
if(IF(q.x,q.y,p.x,p.y,i)==1)
{
q.step=p.step+1;
Q.push(q);
vis[q.x][q.y]=1;
}
}
}
return -1;
}

int main()
{
int T,k;
scanf("%d",&T);
while(T--)
{
int flag=0;
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<n;i++)
{
scanf("%s",maps[i]);
}
for(int i=0;i<=k;i++)
{
scanf("%d %d",&e[i].x,&e[i].y);
e[i].step=0;
if(i!=0 && i!=1)
{
if(e[i].x==e[0].x && e[i].y==e[0].y)
flag=1;
}
}
if(flag==1)
{
printf("-1\n");
continue;
}
int ans=0,sum=0;;
for(int i=1;i<=k;i++)
{
for(int j=i+1;j<=k;j++)
{
maps[e[j].x-1][e[j].y-1]='*';
}
node S,E;
S.x=e[i-1].x-1;
S.y=e[i-1].y-1;
S.step=0;
E.x=e[i].x-1;
E.y=e[i].y-1;
E.step=0;
ans=bfs(S,E);
if(ans==-1)
{
sum=-1;
break;
}
else
sum+=ans;
for(int j=i+1;j<=k;j++)
{
maps[e[j].x-1][e[j].y-1]='.';
}
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: