其实就是一个广搜能解决的问题,但是!!!不知道为啥,
自己码了个广搜还总是WA12,看不到样例哎呀好气。
这个题其实应该在广搜基础上多想一步,根据题目,最后走出来的路肯定是:城镇-----荒野----城镇----荒野,这样子,所以我们也不用判断走的每一步到底是啥,直接算总共多少步,然后ans/2是a,剩下的给b..
int n,m,a,b;
char s[555][555];
int dp[555][555];
int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
int main()
{
cin>>m>>n>>a>>b;
rep(i,n) cin>>s[i];
rep(i,n) rep(j,m) dp[i][j]=-1;
queueq;q.push(make_pair(0,0));
dp[0][0]=0;
while(q.size())
{
pii xx=q.front();q.pop();
if(xx.first==n-1&&xx.second==m-1) break;
rep(k,4)
{
int nx=xx.first+dx[k],ny=xx.second+dy[k];
if(nx<0||nx>=n||ny<0||ny>=m||s[nx][ny]=='#') continue;
s[nx][ny]='#';
dp[nx][ny]=dp[xx.first][xx.second]+1;
q.push(make_pair(nx,ny));
}
}
int ans=dp[n-1][m-1];
if(ans==-1) cout<<"IMPOSSIBLE\n";
else cout<
好了我现在知道为啥了,,,a和b加反了我是憨憨
int n,m,a,b;
char s[555][555];
struct IN
{
int x,y,tag;
IN (int xx,int yy,int t):x(xx),y(yy),tag(t){}
};
int dp[555][555],tag[555][555];
int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
int main()
{
cin>>m>>n>>a>>b;
rep(i,n) cin>>s[i];
rep(i,n) rep(j,m) dp[i][j]=1<<30;
tag[0][0]=1;//城镇
dp[0][0]=0;//从左上角走到这里的花费
queueq;q.push(IN(0,0,1));
while(q.size())
{
IN xx=q.front();q.pop();
if(xx.x==n-1&&xx.y==m-1) break;
rep(k,4)
{
int nx=xx.x+dx[k],ny=xx.y+dy[k];
if(nx<0||nx>=n||ny<0||ny>=m||s[nx][ny]=='#'||tag[nx][ny]) continue;
tag[nx][ny]=xx.tag==1?2:1;
dp[nx][ny]=min(dp[nx][ny],dp[xx.x][xx.y]+(xx.tag==1?b:a));
q.push(IN(nx,ny,tag[nx][ny]));
}
}
if(dp[n-1][m-1]==1<<30) cout<<"IMPOSSIBLE\n";
else cout<