HDU 1429(BFS )

胜利大逃亡(续)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1065    Accepted Submission(s): 379

Problem Description
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……

这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
 

 

Input
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:

. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

每组测试数据之间有一个空行。
 

 

Output
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
 

 

Sample Input
   
   
   
   
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
 

 

Sample Output
   
   
   
   
16 -1
#include <iostream> #include <queue> using namespace std; #define N 25 struct node { int x,y,time,cnt;//cnt标记当前找到钥匙的状态 bool flag[10];//标记当前路径的钥匙 }; char map[N][N];//地图 int mark[N][N][1100];//记录路径的状态,标记当前路径钥匙的状态 int key[10]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; int time; int x1,y1,x2,y2; int dis[4][2] = {{0,1},{1,0},{-1,0},{0,-1}}; void BFS() { int i,k,temp; queue<node> q; node s1,s2; s1.x = x1; s1.y = y1; s1.time = time; s1.cnt = 0; memset(s1.flag,0,sizeof(s1.flag)); q.push(s1); memset(mark,0,sizeof(mark)); while (!q.empty()) { s1 = q.front(); q.pop(); if(s1.x == x2 && s1.y == y2) { if(s1.time > 0) { printf("%d/n",time - s1.time); return; } break; } for(i=0;i<4;i++) { s2=s1; s2.x += dis[i][0]; s2.y += dis[i][1]; s2.time --; if(map[s2.x][s2.y]!='*') { if(map[s2.x][s2.y]>='a' && map[s2.x][s2.y]<='j') { k = map[s2.x][s2.y] - 'a'; if(s2.flag[k]) temp = s2.cnt; else temp = s2.cnt + key[k]; if(!mark[s2.x][s2.y][temp]) { mark[s2.x][s2.y][temp] = 1; s2.cnt = temp; s2.flag[k] = 1; q.push(s2); } } else if(map[s2.x][s2.y]>='A' && map[s2.x][s2.y]<='J') { k = map[s2.x][s2.y] - 'A'; if(s2.flag[k] && !mark[s2.x][s2.y][s2.cnt]) { mark[s2.x][s2.y][s2.cnt] = 1; q.push(s2); } } else if(map[s2.x][s2.y] == '.') { if(!mark[s2.x][s2.y][s2.cnt]) //当前钥匙的路径状态 { mark[s2.x][s2.y][s2.cnt] = 1; q.push(s2); } } } } } printf("-1/n"); } int main() { int n,m,i,j; while (scanf("%d%d%d",&n,&m,&time)!=EOF) { memset(map,'*',sizeof(map)); getchar(); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='@') { x1=i;y1=j; map[i][j]='.'; } else if(map[i][j]=='^') { x2=i;y2=j; map[i][j]='.'; } } getchar(); } BFS(); } return 0; }

你可能感兴趣的:(c,struct,测试,input,output)