标签:des style blog io ar color os sp java
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 170 Accepted Submission(s): 74
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <queue> 6 #include <vector> 7 using namespace std; 8 9 #define N 55 10 11 struct node{ 12 int x, y, step, k; //step为消耗的能量,k为状压,表示拿到哪些钥匙 13 bool operator<(const node a)const{ 14 return a.step<step; 15 } 16 }; 17 18 struct key{ 19 int x, y; 20 }a[10]; //钥匙所在的坐标 21 22 int xx[]={1,-1,0,0}; 23 int yy[]={0,0,1,-1}; 24 25 char map[N][N]; 26 bool visited[N][N][1<<6]; 27 int stx, sty, endx, endy; 28 int n, m, k; 29 30 int bfs(){ 31 priority_queue<node>Q; 32 node p, q; 33 int i, j; 34 p.x=stx,p.y=sty,p.k=0,p.step=0; 35 Q.push(p); 36 memset(visited,false,sizeof(visited)); 37 visited[p.x][p.y][p.k]=true; 38 39 while(!Q.empty()){ 40 p=Q.top();Q.pop(); 41 // printf("%d %d %d %d\n",p.x,p.y,p.step,p.k); 42 if(p.x==endx&&p.y==endy) return p.step; 43 for(i=0;i<4;i++){ 44 p.x+=xx[i],p.y+=yy[i]; 45 if(p.x<0||p.x>=n||p.y<0||p.y>=m||map[p.x][p.y]==‘#‘||visited[p.x][p.y][p.k]){ //若超出范围或该点是墙或这个状态已走过,那么continue 46 p.x-=xx[i],p.y-=yy[i]; 47 continue; 48 } 49 // printf("1111\n"); 50 if(map[p.x][p.y]>=‘A‘&&map[p.x][p.y]<=‘E‘){ 51 if((1<<(map[p.x][p.y]-‘A‘))&p.k){ //若是门且拿到钥匙那么就可以走 52 Q.push(p); 53 visited[p.x][p.y][p.k]=true; 54 } 55 else{ 56 p.x-=xx[i],p.y-=yy[i]; 57 continue; 58 } 59 } 60 else{ 61 int keyy=p.k; 62 for(j=0;j<k;j++){ //遍历钥匙坐标,看是否在这里,在的话就拿上 63 if(p.x==a[j].x&&p.y==a[j].y){ 64 p.k=(1<<j)|p.k; 65 } 66 } 67 if(map[p.x][p.y]>=‘1‘&&map[p.x][p.y]<=‘9‘){ 68 p.step+=map[p.x][p.y]-‘0‘; 69 Q.push(p); 70 visited[p.x][p.y][p.k]=true; 71 p.step-=map[p.x][p.y]-‘0‘; 72 } 73 else{ 74 Q.push(p); 75 visited[p.x][p.y][p.k]=true; 76 } 77 p.k=keyy; 78 } 79 p.x-=xx[i],p.y-=yy[i]; 80 } 81 } 82 return -1; 83 } 84 85 main() 86 { 87 int i, j; 88 int t; 89 cin>>t; 90 while(t--){ 91 scanf("%d %d %d",&n,&m,&k); 92 for(i=0;i<n;i++) scanf("%s",map[i]); 93 for(i=0;i<k;i++) scanf("%d %d",&a[i].x,&a[i].y),--a[i].x,--a[i].y; 94 for(i=0;i<n;i++){ 95 for(j=0;j<m;j++){ 96 if(map[i][j]==‘S‘) stx=i,sty=j; 97 else if(map[i][j]==‘T‘) endx=i,endy=j; 98 } 99 } 100 int ans=bfs(); 101 printf("%d\n",ans); 102 } 103 }
标签:des style blog io ar color os sp java
原文地址:http://www.cnblogs.com/qq1012662902/p/4124983.html