| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
WA 一下午了 不知道哪里有问题 谁能帮我看看?#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <string>
using namespace std;
char m[20][20];
int f[20][20][20][20][2];
int startx,starty,targetx,targety,bx,by;
int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char step[4]={'n','s','w','e'};
struct Node{
string way;
int x[2],y[2];
int push,walk;
};
int r,c;
void bfs(){
bool yes=false;
string best;
int bw=0,bp=0,x,y,i,t,x1,x2,y1,y2,push,walk;
memset(f,-1,sizeof(f));
queue<Node> q;
Node temp,now;
temp.way="";
temp.x[0]=startx; temp.y[0]=starty;
temp.x[1]=bx; temp.y[1]=by;
temp.push=0; temp.walk=0;
f[startx][starty][bx][by][0]=0;
f[startx][starty][bx][by][1]=0;
while(!q.empty()) q.pop();
q.push(temp);
while(!q.empty()){
now=q.front();
q.pop();
x1=now.x[0];
y1=now.y[0];
x2=now.x[1];
y2=now.y[1];
push=now.push;
walk=now.walk;
//cout<<now.way<<' '<<now.x[0]<<' '<<now.y[0]<<' '<<now.x[1]<<' '<<now.y[1]<<endl;
//getch();
if(x2==targetx&&y2==targety){
if(!yes){
best=now.way;
yes=true;
bw=walk;
bp=push;
}
else{
if(bp>push||(bp==push&&bw>walk)){
best=now.way;
bp=push;
bw=walk;
}
}
continue;
}
t=x1+y1-x2-y2;
if(t==1||t==-1){
x=2*x2-x1;
y=2*y2-y1; //推箱子
if(x>=0&&x<r&&y>=0&&y<c&&m[x][y]=='.'){
if(f[x2][y2][x][y][0]==-1||
f[x2][y2][x][y][0]>(push+1)||
(f[x2][y2][x][y][0]==(push+1)&&f[x2][y2][x][y][1]>walk)){
//cout<<"push ";
temp=now;
if(x>x2) temp.way+='S';
else if(x<x2) temp.way+='N';
else if(y>y2) temp.way+='E';
else if(y<y2) temp.way+='W';
temp.x[0]=x2;
temp.y[0]=y2;
temp.x[1]=x;
temp.y[1]=y;
temp.push=f[x2][y2][x][y][0]=push+1;
f[x2][y2][x][y][1]=walk;
//cout<<temp.way<<' '<<temp.x[0]<<' '<<temp.y[0]<<' '<<temp.x[1]<<' '<<temp.y[1]<<endl;
q.push(temp);
}
}
}
for(i=0;i<4;i++){
x=x1+move[i][0];
y=y1+move[i][1];
if(x>=0&&x<r&&y>=0&&y<c&&(x!=x2||y!=y2)&&m[x][y]=='.'){
if(f[x][y][x2][y2][0]==-1||
f[x][y][x2][y2][0]>push||
(f[x][y][x2][y2][0]==push&&f[x][y][x2][y2][1]>walk+1)){
//cout<<"walk ";
temp=now;
temp.way+=step[i];
temp.x[0]=x;
temp.y[0]=y;
f[x][y][x2][y2][0]=push;
temp.walk=f[x][y][x2][y2][1]=now.walk+1;
//cout<<temp.way<<' '<<temp.x[0]<<' '<<temp.y[0]<<' '<<temp.x[1]<<' '<<temp.y[1]<<endl;
q.push(temp);
}
}
} //走路
}
if(yes) cout<<best<<endl;
else cout<<"Impossible."<<endl;
return ;
}
int main(){
int k=1,i,j;
char blank;
while(cin>>r>>c&&(r||c)){
for(i=0;i<r;i++){
for(j=0;j<c;j++){
//scanf("%c",&m[i][j]);
cin>>m[i][j];
if(m[i][j]=='S') { startx=i; starty=j; m[i][j]='.'; }
else if(m[i][j]=='T') { targetx=i; targety=j; m[i][j]='.'; }
else if(m[i][j]=='B') { bx=i; by=j; m[i][j]='.'; }
}
//scanf("%c",&blank);
}
/*for(i=0;i<r;i++){
for(j=0;j<c;j++) cout<<m[i][j];
cout<<endl;
}*/
printf("Maze #%d\n",k++);
bfs();
printf("\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator