CODE+ 第三次网络赛 华尔兹【待更新】
就是一个搜索,但是好像还是有点问题,第六组样例没过去。。
#include <bits/stdc++.h>
#define cl(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
char mp[1500][1500];
int vis[1500][1500];
int n,m,sx,sy,tx,ty;
int dx[]= {0,0,+1,-1};
int dy[]= {+1,-1,0,0};
int dir[]={'d','a','s','w'};
struct node
{
int pre;
char ch;
};
node pre[10500];
int main()
{
cl(pre,-1);
cl(vis,0);
scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);
for(int i=0; i<n; i++)
{
scanf("%s",mp[i]);
}
sx--;
sy--;
tx--;
ty--;
int t=sx*(m)+sy;
queue<int>q;
q.push(t);
while(!q.empty())
{
int x=q.front()/m;
int y=q.front()%m;
q.pop();
if(vis[x][y])continue;
int point=x*m+y;
vis[x][y]=1;
if(x==tx&&y==ty)break;
if(mp[x][y]=='w')
{
int tempx=x+dx[3];
int tempy=y+dy[3];
if(tempx<0||tempx>=m||tempy<0||tempy>=n)continue;
if(!vis[tempx][tempy])
{
int num=tempx*m+tempy;
pre[num].pre=point;
pre[num].ch='w';
q.push(num);
}
}
else if(mp[x][y]=='d')
{
int tempx=x+dx[0];
int tempy=y+dy[0];
if(tempx<0||tempx>=m||tempy<0||tempy>=n)continue;
if(!vis[tempx][tempy])
{
int num=tempx*m+tempy;
pre[num].pre=point;
pre[num].ch='d';
q.push(num);
}
}
else if(mp[x][y]=='s')
{
int tempx=x+dx[2];
int tempy=y+dy[2];
if(tempx<0||tempx>=m||tempy<0||tempy>=n)continue;
if(!vis[tempx][tempy])
{
int num=tempx*m+tempy;
pre[num].pre=point;
pre[num].ch='s';
q.push(num);
}
}
else if(mp[x][y]=='a')
{
int tempx=x+dx[1];
int tempy=y+dy[1];
if(tempx<0||tempx>=m||tempy<0||tempy>=n)continue;
if(!vis[tempx][tempy])
{
int num=tempx*m+tempy;
pre[num].pre=point;
pre[num].ch='a';
q.push(num);
}
}
else
{
for(int i=0; i<4; i++)
{
int tempx=x+dx[i];
int tempy=y+dy[i];
if(tempx<0||tempx>=m||tempy<0||tempy>=n)continue;
if(!vis[tempx][tempy])
{
int num=tempx*m+tempy;
pre[num].pre=point;
pre[num].ch=dir[i];
q.push(num);
}
}
}
}
cout<<endl;
int k=tx*m+ty;
for(node i=pre[k];i.pre!=-1;)
{
int xx=i.pre/m;
int yy=i.pre%m;
mp[xx][yy]=i.ch;
i=pre[i.pre];
}
for(int i=0;i<n;i++)
{
printf("%s\n",mp[i]);
}
return 0;
}