#include <iostream> #include <queue> using namespace std; struct Pun{unsigned long long int x,y,w,z,k; Pun(unsigned long long int _x, unsigned long long int _y, unsigned long long int _w, unsigned long long int _z, unsigned long long int _k): x(_x), y(_y), w(_w), z(_z), k(_k){}; }; const unsigned long long int N=2005; char tab[N][N]; bool odwiedzony[N][N]; unsigned long long int n,m; Pun m_k(N-1,N-1,N,N,N); inline bool is_posible(Pun p) { if(p.x<0 || p.x>=n || p.y<0 || p.y>=m) return false; if(p.x==n-1 && p.y==m-1) { m_k=p; m_k.w++; } if(odwiedzony[p.x][p.y] || tab[p.x][p.y]=='X') return false; odwiedzony[p.x][p.y]=true; return true; } inline void BFS() { queue <Pun> kolejka; Pun punkt(0,0,0,0,0);kolejka.push(punkt); while(!kolejka.empty()) { punkt=kolejka.front(); kolejka.pop(); if(is_posible(Pun(punkt.x+1,punkt.y,punkt.w,punkt.z, punkt.k+1))) { if(punkt.x+1==n-1 && punkt.y==m-1) return; kolejka.push(Pun(punkt.x+1,punkt.y,punkt.w+1,punkt.z, punkt.k+1)); } if(is_posible(Pun(punkt.x,punkt.y+1,punkt.w,punkt.z, punkt.k+1))) { if(punkt.x==n-1 && punkt.y+1==m-1) return; kolejka.push(Pun(punkt.x,punkt.y+1,punkt.w+1,punkt.z, punkt.k+1)); } if(is_posible(Pun(punkt.x-1,punkt.y,punkt.w,punkt.z+1, punkt.k+1))) kolejka.push(Pun(punkt.x-1,punkt.y,punkt.w,punkt.z+1, punkt.k+1)); if(is_posible(Pun(punkt.x,punkt.y-1,punkt.w,punkt.z+1, punkt.k+1))) kolejka.push(Pun(punkt.x,punkt.y-1,punkt.w,punkt.z+1, punkt.k+1)); } } int main() { unsigned long long int za,a,b,min_wyn=1000000000000000000,ile=0; cin>>n>>m>>za; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>tab[i][j]; BFS(); for(int i=0;i<za;i++) { cin>>a>>b; if(a*m_k.w+b*m_k.z<min_wyn) { min_wyn=a*m_k.w+b*m_k.z; ile=0; } if(a*m_k.w+b*m_k.z==min_wyn) ile++; } cout<<min_wyn<<" "<<ile<<"\n"; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> #include <queue> using namespace std; struct Pun{unsigned long long int x,y,w,z,k; Pun(unsigned long long int _x, unsigned long long int _y, unsigned long long int _w, unsigned long long int _z, unsigned long long int _k): x(_x), y(_y), w(_w), z(_z), k(_k){}; }; const unsigned long long int N=2005; char tab[N][N]; bool odwiedzony[N][N]; unsigned long long int n,m; Pun m_k(N-1,N-1,N,N,N); inline bool is_posible(Pun p) { if(p.x<0 || p.x>=n || p.y<0 || p.y>=m) return false; if(p.x==n-1 && p.y==m-1) { m_k=p; m_k.w++; } if(odwiedzony[p.x][p.y] || tab[p.x][p.y]=='X') return false; odwiedzony[p.x][p.y]=true; return true; } inline void BFS() { queue <Pun> kolejka; Pun punkt(0,0,0,0,0);kolejka.push(punkt); while(!kolejka.empty()) { punkt=kolejka.front(); kolejka.pop(); if(is_posible(Pun(punkt.x+1,punkt.y,punkt.w,punkt.z, punkt.k+1))) { if(punkt.x+1==n-1 && punkt.y==m-1) return; kolejka.push(Pun(punkt.x+1,punkt.y,punkt.w+1,punkt.z, punkt.k+1)); } if(is_posible(Pun(punkt.x,punkt.y+1,punkt.w,punkt.z, punkt.k+1))) { if(punkt.x==n-1 && punkt.y+1==m-1) return; kolejka.push(Pun(punkt.x,punkt.y+1,punkt.w+1,punkt.z, punkt.k+1)); } if(is_posible(Pun(punkt.x-1,punkt.y,punkt.w,punkt.z+1, punkt.k+1))) kolejka.push(Pun(punkt.x-1,punkt.y,punkt.w,punkt.z+1, punkt.k+1)); if(is_posible(Pun(punkt.x,punkt.y-1,punkt.w,punkt.z+1, punkt.k+1))) kolejka.push(Pun(punkt.x,punkt.y-1,punkt.w,punkt.z+1, punkt.k+1)); } } int main() { unsigned long long int za,a,b,min_wyn=1000000000000000000,ile=0; cin>>n>>m>>za; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>tab[i][j]; BFS(); for(int i=0;i<za;i++) { cin>>a>>b; if(a*m_k.w+b*m_k.z<min_wyn) { min_wyn=a*m_k.w+b*m_k.z; ile=0; } if(a*m_k.w+b*m_k.z==min_wyn) ile++; } cout<<min_wyn<<" "<<ile<<"\n"; return 0; } |