一位博主写了ac代码,但是无论是广度bfs还是深度dfs,都会报错,dfs是运行超时,bfs是答案错误。传送门:http://idealwill.com/2018/02/24/bfs-flee/
另一位博主使用了dfs代码,有兴趣可以看下,没有检验是否正确,传送门:https://blog.youkuaiyun.com/Liukairui/article/details/79407437
根据前位博主的bfs代码,做了几项修改,然后用自己的代码找错前位博主,发现找不出来,有兴趣的小伙伴可以试下,找一下前位博主的错误。当然虽然ac了,但是自己打的代码,稍有不懂,如果能够说出这里这样写代码的原理,也是十分感谢的。
ac代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int M=110;
int n,m,k,d,ans=0;
int t,v,x,y;
char dirx;
int dir[5][2]={0,1,1,0,0,-1,-1,0,0,0};
bool vis[1000][M][M];
char soldier[M][M];
bool in(int x,int y)
{
return 0<=x&&x<=n&&0<=y&&y<=m;
}
struct node{
int t,x,y;
node(int _t,int _x,int _y):
t(_t),x(_x),y(_y){}
};
void bfs()
{
queue<node> q;
q.push(node(0,0,0));
vis[0][0][0]=true;
while(!q.empty())
{
int t=q.front().t;
int x=q.front().x;
int y=q.front().y;
q.pop();
if(t>=d+1)continue;
if(x==n&&y==m)
{
ans=t;
return;
}
for(int i=0;i<5;i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(in(tx,ty)&&!vis[t+1][tx][ty]&&soldier[tx][ty] =='.')
{
vis[t+1][tx][ty]=true;
q.push(node(t+1,tx,ty));
}
}
}
return;
}
void signvis(){
soldier[x][y] ='#';
if(dirx == 'N'){
int col_num = x;
int val_num = (col_num / v);
if(val_num > 0){
for(int a = 0; a <= d; a += t){
for(int b = 1; b <= val_num; b++){
int xx = x - b*v;
vis[a+b][xx][y] = true;
}
}
}
}
else if(dirx == 'S'){
int col_num = n - x;
int val_num = (col_num / v);
if(val_num > 0){
for(int a = 0; a <= d; a += t){
for(int b = 1; b <= val_num; b++){
int xx = x + b*v;
vis[a+b][xx][y] = true;
}
}
}
}
else if(dirx == 'W'){
int row_num = y;
int val_num = (row_num / v);
if(val_num > 0){
for(int a = 0; a <= d; a += t){
for(int b = 1; b <= val_num; b++){
int yy = y - b*v;
vis[a+b][x][yy] = true;
}
}
}
}
else if(dirx == 'E'){
int row_num = m - y;
int val_num = (row_num / v);
if(val_num > 0){
for(int a = 0; a <= d; a += t){
for(int b = 1; b <= val_num; b++){
int yy = y + b*v;
vis[a+b][x][yy] = true;
}
}
}
}
}
int main()
{
freopen("1.txt","r",stdin);
memset(vis,false,sizeof(vis));
memset(soldier,'.',sizeof(soldier));
cin>>n>>m>>k>>d;
for(int i = 0; i <=k; i++)
{
cin >> dirx >> t >> v >> x >> y;
signvis();
}
bfs();
if(ans==0)
cout<<"Bad luck!"<<endl;
else
cout<<ans<<endl;
return 0;
}