前情提要:题面逆天,笑死我了。。
这道题一眼就是个搜索,然后我就随手写了个 dfs。
//不是哥们这题面笑死我了
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
char mp[N][N];
int vis[N][N];
int sx,sy,tx,ty;
int ans=1000005;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
void dfs(int x,int y,int step)
{
if(x==tx&&y==ty)
{
ans=min(ans,step);
return;
}
for(int i=0;i<4;i++)
{
int xx=x;
int yy=y;
while((xx!=tx||yy!=ty)&&xx+dx[i]>0&&yy+dy[i]>0&&xx+dx[i]<=n&&yy+dy[i]<=m&&mp[xx+dx[i]][yy+dy[i]]=='0')
{
xx+=dx[i];
yy+=dy[i];
}
if(vis[xx][yy]==1)
{
continue;
}
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
}
}
cin>>sx>>sy>>tx>>ty;
// vis[sx][sy]=1;
dfs(sx,sy,0);
cout<<ans;
return 0;
}
然后……不是怎么又 T 又 WA 的啊!!!(此时只有 50pts)
于是我就经历了一通的头脑风暴……
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
char mp[N][N];
struct node
{
int x,y,step;
};
queue<node>q;
node s,t;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int vis[N][N];
bool flag=1;
int ans=0;
void bfs()
{
while(!q.empty())
{
node tmp=q.front();
q.pop();
cout<<tmp.x<<' '<<tmp.y<<endl;
if(tmp.x==t.x&&tmp.y==t.y)
{
ans=tmp.step;
flag=0;
return;
}
for(int i=0;i<4;i++)
{
node a=tmp;
while(a.x+dx[i]>0&&a.y+dy[i]>0&&a.x+dx[i]<=n&&a.y+dx[i]<=m&&mp[a.x+dx[i]][a.y+dy[i]]=='0'&&(a.x!=t.x||a.y!=t.y)&&vis[a.x+dx[i]][a.y+dy[i]]==0)
{
a.x+=dx[i];
a.y+=dy[i];
}
a.step++;
if(a.x==tmp.x&&a.y==tmp.y)
{
continue;
}
if(a.x==t.x&&a.y==t.y)
{
ans=a.step;
flag=0;
return;
}
q.push(a);
vis[a.x][a.y]=1;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
}
}
cin>>s.x>>s.y>>t.x>>t.y;
s.step=0;
q.push(s);
vis[s.x][s.y]=1;
bfs();
if(flag)
{
cout<<"No!God!Please no!";
}
else
{
cout<<ans;
}
return 0;
}
不是,这下只剩 30pts 就算了,怎么还是 WA+RE 的!!!
下面的调试过程就不贴了。
关于 WA 的问题其实就是一些小细节,原因是我手误把条件里的 a.y+dy[i]
写成了 a.y+dx[i]
。
还有一部分问题就是我判断条件写得有点儿问题。
下面上正常的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
char mp[N][N];
struct node
{
int x,y,step;
};
queue<node>q;
node s,t;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int vis[N][N];
bool flag=1;
int ans=0;
void bfs()
{
while(!q.empty())
{
node tmp=q.front();
q.pop();
// cout<<tmp.x<<' '<<tmp.y<<endl;
if(tmp.x==t.x&&tmp.y==t.y)
{
ans=tmp.step;
flag=0;
return;
}
for(int i=0;i<4;i++)
{
node a=tmp;
while(a.x+dx[i]>0&&a.y+dy[i]>0&&a.x+dx[i]<=n&&a.y+dy[i]<=m&&mp[a.x+dx[i]][a.y+dy[i]]=='0'&&(a.x!=t.x||a.y!=t.y))
{
a.x+=dx[i];
a.y+=dy[i];
}
a.step++;
if(a.x==tmp.x&&a.y==tmp.y)
{
continue;
}
if(vis[a.x][a.y])
{
continue;
}
if(a.x==t.x&&a.y==t.y)
{
ans=a.step;
flag=0;
return;
}
q.push(a);
vis[a.x][a.y]=1;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
}
}
cin>>s.x>>s.y>>t.x>>t.y;
s.step=0;
q.push(s);
vis[s.x][s.y]=1;
bfs();
if(flag)
{
cout<<"No!God!Please no!";
}
else
{
cout<<ans;
}
return 0;
}