标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8871 Accepted Submission(s): 4270
Sample Output
4
-1
13
此题重点是有些点可以重复走,但是重置时间点不需要从新走,如果走到该点tim小于以前的或者走到该点路程更短走该地可以重复走。
此题可以用BFS来写,下次补充BFS代码
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define size 10 5 #define Max 10000 6 using namespace std; 7 int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; 8 int map[size][size]; 9 int ti[size][size]; 10 int st[size][size]; 11 int n,m; 12 int tim,len; 13 bool flag=0; 14 int Minlen=Max; 15 int xs,ys; 16 bool flag0; 17 int nx,ny; 18 int dfs(int x,int y,int tim,int len) 19 { 20 int i,j; 21 if(map[x][y]==0||tim<=0||x<0||x>=n||y<0||y>=m||len>=Minlen) 22 return 0; 23 if(map[x][y]==3&&len<Minlen) 24 { 25 flag=1; 26 Minlen=len; 27 return 0; 28 } 29 if(map[x][y]==4) 30 tim=6; 31 if(tim>ti[x][y]||len<st[x][y]) 32 { 33 ti[x][y]=tim; 34 st[x][y]=len; 35 for(i=0;i<4;i++) 36 { 37 nx=x+dx[i]; 38 ny=y+dy[i]; 39 dfs(nx,ny,tim-1,len+1); 40 } 41 } 42 return 0; 43 } 44 int main() 45 { 46 int T; 47 int i,j; 48 freopen("in.txt","r",stdin); 49 cin>>T; 50 while(T--) 51 { 52 cin>>n>>m; 53 for(i=0;i<n;i++) 54 for(j=0;j<m;j++) 55 { 56 cin>>map[i][j]; 57 if(map[i][j]==2) 58 { 59 xs=i; 60 ys=j; 61 } 62 } 63 len=0; 64 tim=6; 65 Minlen=Max; 66 flag=0; 67 memset(ti,0,sizeof(ti)); 68 for(i=0;i<size;i++) 69 for(j=0;j<size;j++) 70 st[i][j]=200000; 71 dfs(xs,ys,tim,len); 72 if(!flag) cout<<-1<<endl; 73 else cout<<Minlen<<endl; 74 } 75 }
标签:
原文地址:http://www.cnblogs.com/a1225234/p/4999083.html