题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26772
思路:注意判重就行,开个6维数组记录3个robots的位置,然后要注意的就是不能多个robots同时在一个格子上,一开始没注意到这点!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 11 struct Point{
int x,y;
}; struct Node{
Point p[];
int step;
}st; char map[MAXN][MAXN];
bool mark[MAXN][MAXN][MAXN][MAXN][MAXN][MAXN];
int n,dir[][]={{-,},{,},{,-},{,}}; void bfs()
{
memset(mark,false,sizeof(mark));
queue<Node>que;
st.step=;
que.push(st);
mark[st.p[].x][st.p[].y][st.p[].x][st.p[].y][st.p[].x][st.p[].y]=true;
while(!que.empty()){
Node q,pp=que.front();
que.pop();
if(map[pp.p[].x][pp.p[].y]=='X'&&map[pp.p[].x][pp.p[].y]=='X'&&map[pp.p[].x][pp.p[].y]=='X'){
printf("%d\n",pp.step);
return ;
}
for(int i=;i<;i++){
for(int j=;j<=;j++){
q.p[j].x=pp.p[j].x+dir[i][],q.p[j].y=pp.p[j].y+dir[i][];
if(q.p[j].x<||q.p[j].x>=n||q.p[j].y<||q.p[j].y>=n){
q.p[j].x=pp.p[j].x,q.p[j].y=pp.p[j].y;
}else if(map[q.p[j].x][q.p[j].y]=='#'){
q.p[j].x=pp.p[j].x,q.p[j].y=pp.p[j].y;
}
}
//robots不能在同一个格子上
for(int l=;l<=;l++){
for(int j=;j<=;j++){
for(int k=;k<=;k++)if(j!=k){
if(q.p[j].x==q.p[k].x&&q.p[j].y==q.p[k].y)q.p[j].x=pp.p[j].x,q.p[j].y=pp.p[j].y;
}
}
}
if(!mark[q.p[].x][q.p[].y][q.p[].x][q.p[].y][q.p[].x][q.p[].y]){
mark[q.p[].x][q.p[].y][q.p[].x][q.p[].y][q.p[].x][q.p[].y]=true;
q.step=pp.step+;
que.push(q);
}
}
}
puts("trapped");
} int main()
{
int _case,num,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d",&n);
num=;
for(int i=;i<n;i++){
scanf("%s",map[i]);
for(int j=;j<n;j++){
if(map[i][j]=='A'||map[i][j]=='B'||map[i][j]=='C'){
st.p[num].x=i,st.p[num].y=j;
num++;
}
}
}
printf("Case %d: ",t++);
bfs();
}
return ;
}