hdu 2128(bfs)
题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=2128
思路:这题判重比较麻烦,我是这样做的:每个状态记录炸弹数目以及爆破点的坐标映射,还要有一个访问数组来标记已经取过的炸弹的位置(下次经过就不能再取了),由于要求时间最短,可以考虑优先队列。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 struct Node { 8 int x,y,time; 9 bool operator < (const Node &p) const { 10 return p.time<time; 11 } 12 int key;//炸药 13 int count;//所有爆破位置的坐标的映射(有点瞎搞的味道,hd数据弱,应该也会有冲突的吧) 14 bool visited[9][9];//记录每个状态爆破的位置,有可能重复走 15 } st; 16 char map[9][9]; 17 bool mark[9][9][66][2222];//标记 18 int n,m; 19 int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; 20 int ex,ey; 21 22 bool bfs() { 23 memset(mark,false,sizeof(mark)); 24 mark[st.x][st.y][st.key][st.count]=true; 25 Node p,q; 26 priority_queue<Node>Q; 27 Q.push(st); 28 while(!Q.empty()) { 29 p=Q.top(); 30 Q.pop(); 31 if(p.x==ex&&p.y==ey) { 32 printf("%d\n",p.time); 33 return true; 34 } 35 for(int i=0; i<4; i++) { 36 q=p; 37 q.x=p.x+dir[i][0]; 38 q.y=p.y+dir[i][1]; 39 q.time=p.time+1; 40 if(q.x<1||q.x>n||q.y<1||q.y>m)continue; 41 if(map[q.x][q.y]=='.') { 42 if(!mark[q.x][q.y][q.key][q.count]) { 43 mark[q.x][q.y][q.key][q.count]=true; 44 Q.push(q); 45 } 46 } else if(map[q.x][q.y]=='X') { 47 if(!q.visited[q.x][q.y]) { 48 if(q.key>0) { 49 q.key--,q.count+=(q.x*q.y+8*(q.x+q.y)); 50 q.time++; 51 q.visited[q.x][q.y]=true; 52 if(!mark[q.x][q.y][q.key][q.count]) { 53 mark[q.x][q.y][q.key][q.count]=true; 54 Q.push(q); 55 } 56 } 57 } else if(!mark[q.x][q.y][q.key][q.count]) { 58 mark[q.x][q.y][q.key][q.count]=true; 59 Q.push(q); 60 } 61 } else { 62 if(!q.visited[q.x][q.y]) { 63 q.visited[q.x][q.y]=true; 64 q.key+=map[q.x][q.y]-'0'; 65 } 66 if(!mark[q.x][q.y][q.key][q.count]) { 67 mark[q.x][q.y][q.key][q.count]=true; 68 Q.push(q); 69 } 70 } 71 } 72 } 73 return false; 74 } 75 76 77 int main() { 78 // freopen("1.txt","r",stdin); 79 while(scanf("%d%d",&n,&m),(n+m)) { 80 for(int i=1; i<=n; i++) { 81 scanf("%s",map[i]+1); 82 for(int j=1; j<=m; j++) { 83 if(map[i][j]=='S') { 84 map[i][j]='.'; 85 st.x=i; 86 st.y=j; 87 st.time=st.key=st.count=0; 88 memset(st.visited,false,sizeof(st.visited)); 89 st.visited[st.x][st.y]=true; 90 } else if(map[i][j]=='D') { 91 map[i][j]='.'; 92 ex=i,ey=j; 93 } 94 } 95 } 96 if(!bfs())puts("-1"); 97 } 98 return 0; 99 }