其实这个题挺基础的,想到了把结构体设置成两个人的坐标&时间,也想到了两个人的位置也需要不能走重复,但是悲剧的设置成了三维的,但是……我们需要的是这两人不能走过之前的位置,注意,是,俩人的位置不能同时与之前某一时间的相同!所以要设置成四维的
再就是,能从0开始就不要从1开始读入数组……
忧伤啊
WA的 各位看官猜猜哪里错了~。~果然就是从“1”开始这个地方错了→_→ 细心啊啊啊啊啊
/***********
hdu2216
2015.12.7-2015.12.8
***********/
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int m,n;
int z1,z2,s1,s2;
char map[25][25];
int vis[25][25][25][25];
int to[4][2] = {1,0,-1,0,0,-1,0,1};//Z的走法
int to2[4][2] = {-1,0,1,0,0,1,0,-1};//S走相反路线
struct node
{
int x1,x2,y1,y2,step;
};
int check(int x,int y)
{
if(x<0 || y<0 || x>=n || y>=m || map[x][y] == 'X')
return 1;
return 0;
}
int judge(int x,int x1,int y,int y1)//符合条件的状况
{
if(x == x1 && y == y1)
return 1;
if(x == x1+1 && y == y1)
return 1;
if(x == x1-1 && y == y1)
return 1;
if(x == x1 && y == y1-1)
return 1;
if(x == x1 && y == y1+1)
return 1;
return 0;
}
int bfs()
{
queue<node> Q;
node cur,next;
cur.x1=z1,cur.y1=z2,cur.x2=s1,cur.y2=s2,cur.step=0;
vis[z1][z2][s1][s2]=1;
Q.push(cur);
while(!Q.empty())
{
cur=Q.front();//普通队列的头不叫pop !!
// printf("zx=%d zy=%d sx=%d sy=%d step=%d\n",cur.zx,cur.zy,cur.sx,cur.sy,cur.step);
Q.pop();
if(judge(cur.x1,cur.x2,cur.y1,cur.y2)) return cur.step;
for(int i=0;i<4;i++)
{
next=cur;
next.x1+=to[i][0];
next.y1+=to[i][1];
next.x2+=to2[i][0];
next.y2+=to2[i][1];
if(check(next.x1,next.y1)) continue;
// if(judge(next)) return next.step;
if(check(next.x2,next.y2))
{
next.x2=cur.x2;
next.y2=cur.y2;
}
if(vis[next.x1][next.y1][next.x2][next.y2]) continue;
vis[next.x1][next.y1][next.x2][next.y2]=1;
next.step=cur.step+1;
Q.push(next);
}
}
return -1;
}
int main()
{
// freopen("cin.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%s",map[i]+1);
for(int j=1;j<=m;j++)
{
if(map[i][j]=='Z') map[i][j]='.',z1=i,z2=j;
if(map[i][j]=='S') map[i][j]='.',s1=i,s2=j;
}
}
memset(vis,0,sizeof(vis));
int ans=bfs();
if(ans!=-1)printf("%d\n",ans);
else printf("Bad Luck!\n");
}
return 0;
}
AC的
/***********
hdu2216
2015.12.7-2015.12.8
***********/
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int m,n;
int z1,z2,s1,s2;
char map[25][25];
int vis[25][25][25][25];
int to[4][2] = {1,0,-1,0,0,-1,0,1};//Z的走法
int to2[4][2] = {-1,0,1,0,0,1,0,-1};//S走相反路线
struct node
{
int x1,x2,y1,y2,step;
};
int check(int x,int y)
{
if(x<0 || y<0 || x>=n || y>=m || map[x][y] == 'X')
return 1;
return 0;
}
int judge(int x,int x1,int y,int y1)//符合条件的状况
{
if(x == x1 && y == y1)
return 1;
if(x == x1+1 && y == y1)
return 1;
if(x == x1-1 && y == y1)
return 1;
if(x == x1 && y == y1-1)
return 1;
if(x == x1 && y == y1+1)
return 1;
return 0;
}
int bfs()
{
queue<node> Q;
node cur,next;
cur.x1=z1,cur.y1=z2,cur.x2=s1,cur.y2=s2,cur.step=0;
vis[z1][z2][s1][s2]=1;
Q.push(cur);
while(!Q.empty())
{
cur=Q.front();//普通队列的头不叫pop !!
// printf("zx=%d zy=%d sx=%d sy=%d step=%d\n",cur.zx,cur.zy,cur.sx,cur.sy,cur.step);
Q.pop();
if(judge(cur.x1,cur.x2,cur.y1,cur.y2)) return cur.step;
for(int i=0;i<4;i++)
{
next=cur;
next.x1=cur.x1+to[i][0];
next.y1=cur.y1+to[i][1];
next.x2=cur.x2+to2[i][0];
next.y2=cur.y2+to2[i][1];
if(check(next.x1,next.y1)) continue;
// if(judge(next)) return next.step;
if(check(next.x2,next.y2))
{
next.x2=cur.x2;
next.y2=cur.y2;
}
if(vis[next.x1][next.y1][next.x2][next.y2]) continue;
vis[next.x1][next.y1][next.x2][next.y2]=1;
next.step=cur.step+1;
Q.push(next);
}
}
return -1;
}
int main()
{
// freopen("cin.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='Z') map[i][j]='.',z1=i,z2=j;
if(map[i][j]=='S') map[i][j]='.',s1=i,s2=j;
}
}
memset(vis,0,sizeof(vis));
int ans=bfs();
if(ans!=-1)printf("%d\n",ans);
else printf("Bad Luck!\n");
}
return 0;
}
自己AC的~
0MS | 2424K | 2374 B |
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int zx,zy,sx,sy,step;
};
char str[30][30];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m,z_x,z_y,s_x,s_y;
bool vis[30][30][30][30];
bool judge(node a)
{
if(a.zx==a.sx&&a.zy==a.sy)return 1;
if(a.zx==a.sx+1&&a.zy==a.sy) return 1;
if(a.zx+1==a.sx&&a.zy==a.sy) return 1;
if(a.zx==a.sx&&a.zy==a.sy+1) return 1;
if(a.zx==a.sx&&a.zy==a.sy-1) return 1;
return 0;
}
bool jud0(int z_x,int z_y)
{
if(z_x<1||z_x>n||z_y<1||z_y>m||str[z_x][z_y]=='X') return 1;
return 0;
}
bool jug1(int z_x,int z_y,int s_x,int s_y)
{
if(vis[z_x][z_y][s_x][s_y]||str[z_x][z_y]=='X') return 1;
if(s_x<0||s_x>n||s_y<0||s_y>m||str[s_x][s_y]=='X')return 1;
return 0;
}
int bfs()
{
queue<node> Q;
node cur,next;
cur.zx=z_x,cur.zy=z_y,cur.sx=s_x,cur.sy=s_y,cur.step=0;
vis[z_x][z_y][s_x][s_y]=1;
Q.push(cur);
while(!Q.empty())
{
cur=Q.front();//普通队列的头不叫pop !!
// printf("zx=%d zy=%d sx=%d sy=%d step=%d\n",cur.zx,cur.zy,cur.sx,cur.sy,cur.step);
Q.pop();
if(judge(cur)) return cur.step;
for(int i=0;i<4;i++)
{
next=cur;
next.step++;
next.zx+=dir[i][0];
next.zy+=dir[i][1];
if(jud0(next.zx,next.zy)) continue;
// if(judge(next)) return next.step;
next.sx-=dir[i][0];
next.sy-=dir[i][1];
if(jud0(next.sx,next.sy))
{
next.sx+=dir[i][0];
next.sy+=dir[i][1];
}
if(vis[next.zx][next.zy][next.sx][next.sy]) continue;
vis[next.zx][next.zy][next.sx][next.sy]=1;
Q.push(next);
}
}
return -1;
}
int main()
{
// freopen("cin.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%s",str[i]+1);
for(int j=1;j<=m;j++)
{
if(str[i][j]=='Z') z_x=i,z_y=j;
if(str[i][j]=='S') s_x=i,s_y=j;
}
}
memset(vis,0,sizeof(vis));
int ans=bfs();
if(ans!=-1)printf("%d\n",ans);
else printf("Bad Luck!\n");
}
return 0;
}
以后可长点心吧~~真要是比赛怎么办