Patrol Robot UVA - 1600
题意:给一个矩阵,从(1,1)走到(m,n)的最短路,"1"是障碍,不能连续穿过k个障碍。
WA了16次,花费了一个上午和半个下午。。。想😭
每个点的属性至少是3维,比如每个点带有的已经连续穿过障碍的次数,再把跑过的步长算上,就四维了,所以最好用一个结构体!
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 struct point{ 8 int x,y,step,k; 9 point(int x,int y,int step,int k):x(x),y(y),step(step),k(k){}; 10 }; 11 12 int T,n,m,kk; 13 int map[30][30]; 14 bool vis[30][30]; 15 16 int dx[4]={1,0,-1,0}; 17 int dy[4]={0,1,0,-1}; 18 19 int BFS() 20 { memset(vis,false,sizeof(vis)); 21 22 queue<point> q; 23 q.push(point(0,0,0,kk)); 24 25 int x,y; 26 while(q.size()){ 27 x=q.front().x,y=q.front().y; 28 if(x==m-1&&y==n-1) return q.front().step; 29 vis[x][y]=true; 30 for(int i=0;i<4;i++){ 31 int mx=dx[i]+x,my=dy[i]+y; 32 if(mx<0||mx>=m||my<0||my>=n||vis[mx][my]) continue; 33 if(map[mx][my]==0) q.push(point(mx,my,q.front().step+1,kk)); 34 if(map[mx][my]==1&&q.front().k>0) q.push(point(mx,my,q.front().step+1,q.front().k-1)); 35 } 36 q.pop(); 37 } 38 return -1; 39 } 40 41 int main() 42 { while(cin>>T){ 43 while(T--){ 44 scanf("%d%d%d",&m,&n,&kk); 45 for(int i=0;i<m;i++){ 46 for(int j=0;j<n;j++) cin>>map[i][j]; 47 } 48 cout<<BFS()<<endl; 49 } 50 } 51 return 0; 52 }
WA代码:然而并不是很明白为什么会错。。。。。。。。。。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 typedef pair<int,int> P; 7 8 const int INF=100000; 9 10 int T,n,m,k; 11 bool vis[30][30]; 12 int map[30][30],dis[30][30],cnt[30][30]; 13 14 int dx[4]={1,0,-1,0}; 15 int dy[4]={0,1,0,-1}; 16 17 void init() 18 { 19 for(int i=0;i<m;i++){ 20 for(int j=0;j<n;j++){ 21 cnt[i][j]=0; 22 dis[i][j]=INF; 23 vis[i][j]=false; 24 } 25 } 26 dis[0][0]=0; 27 vis[0][0]=true; 28 } 29 30 void BFS(int start,int end) 31 { 32 queue<P> q; 33 q.push(make_pair(start,end)); 34 35 while(q.size()){ 36 P tem=q.front(); 37 q.pop(); 38 for(int i=0;i<4;i++){ 39 int mx=dx[i]+tem.first,my=dy[i]+tem.second; 40 if(mx<0||mx>=m||my<0||my>=n||vis[mx][my]) continue; 41 if(map[mx][my]==1){ 42 if(map[tem.first][tem.second]==1){ 43 if(cnt[tem.first][tem.second]+1>k) continue; 44 else cnt[mx][my]=cnt[tem.first][tem.second]+1; 45 } 46 else{ 47 cnt[mx][my]=1; 48 if(cnt[mx][my]>k){ 49 cnt[mx][my]=0; 50 continue; 51 } 52 } 53 } 54 else cnt[mx][my]=0; 55 56 dis[mx][my]=dis[tem.first][tem.second]+1; 57 vis[mx][my]=true; 58 if(mx==m-1&&my==n-1) return; 59 q.push(make_pair(mx,my)); 60 } 61 } 62 } 63 64 int main() 65 { while(cin>>T){ 66 while(T--){ 67 scanf("%d%d",&m,&n); 68 scanf("%d",&k); 69 for(int i=0;i<m;i++){ 70 for(int j=0;j<n;j++) cin>>map[i][j]; 71 } 72 73 init(); 74 BFS(0,0); 75 76 if(dis[m-1][n-1]==INF) cout<<"-1"<<endl; 77 else cout<<dis[m-1][n-1]<<endl; 78 } 79 } 80 return 0; 81 }