//Autor: Jacek Markiewicz #include <bits/stdc++.h> using namespace std; struct Pos{ int x,y; }; int n,m; bitset<2002>vis[2002]; pair<short,short> dist[2002][2002]; // <up,down> void bfs(Pos pos){ queue<Pos> cur; cur.push(pos); dist[pos.x][pos.y]={0,0}; vis[pos.x][pos.y]=1; while(!cur.empty()){ pos=cur.front(); cur.pop(); //RIGHT if(pos.x+1<m) if(!vis[pos.x+1][pos.y]){ cur.push({pos.x+1,pos.y}); vis[pos.x+1][pos.y]=1; dist[pos.x+1][pos.y]={dist[pos.x][pos.y].first+1,dist[pos.x][pos.y].second}; }// DOWN if(pos.y+1<n) if(!vis[pos.x][pos.y+1]){ cur.push({pos.x,pos.y+1}); vis[pos.x][pos.y+1]=1; dist[pos.x][pos.y+1]={dist[pos.x][pos.y].first+1,dist[pos.x][pos.y].second}; }//LEFT if(pos.x-1>=0) if(!vis[pos.x-1][pos.y]){ cur.push({pos.x-1,pos.y}); vis[pos.x-1][pos.y]=1; dist[pos.x-1][pos.y]={dist[pos.x][pos.y].first,dist[pos.x][pos.y].second+1}; }// UP if(pos.y-1>=0) if(!vis[pos.x][pos.y-1]){ cur.push({pos.x,pos.y-1}); vis[pos.x][pos.y-1]=1; dist[pos.x][pos.y-1]={dist[pos.x][pos.y].first,dist[pos.x][pos.y].second+1}; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int k; char tmp; cin >> n >> m >> k; for(int y=0; y<n; ++y){ for(int x=0; x<m; ++x){ cin >> tmp; if(tmp=='X') vis[x][y]=1; //else vis[x][y]=0; } } bfs({0,0}); int mini=INT_MAX,il=1; pair<int,int> wynik; wynik={dist[m-1][n-1].first,dist[m-1][n-1].second}; // cout <<'x' << wynik.first << ' ' << wynik.second << '\n'; for(int i=0; i<k; ++i){ int a,b; cin >> a >> b; // cout << a*wynik.first+b*wynik.second << '\n'; const int odl=a*wynik.first+b*wynik.second; if(odl==mini){ ++il; }else if(odl<mini){ mini=odl; il=1; } } cout << mini << ' ' << il; 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 75 76 77 78 79 80 81 82 83 | //Autor: Jacek Markiewicz #include <bits/stdc++.h> using namespace std; struct Pos{ int x,y; }; int n,m; bitset<2002>vis[2002]; pair<short,short> dist[2002][2002]; // <up,down> void bfs(Pos pos){ queue<Pos> cur; cur.push(pos); dist[pos.x][pos.y]={0,0}; vis[pos.x][pos.y]=1; while(!cur.empty()){ pos=cur.front(); cur.pop(); //RIGHT if(pos.x+1<m) if(!vis[pos.x+1][pos.y]){ cur.push({pos.x+1,pos.y}); vis[pos.x+1][pos.y]=1; dist[pos.x+1][pos.y]={dist[pos.x][pos.y].first+1,dist[pos.x][pos.y].second}; }// DOWN if(pos.y+1<n) if(!vis[pos.x][pos.y+1]){ cur.push({pos.x,pos.y+1}); vis[pos.x][pos.y+1]=1; dist[pos.x][pos.y+1]={dist[pos.x][pos.y].first+1,dist[pos.x][pos.y].second}; }//LEFT if(pos.x-1>=0) if(!vis[pos.x-1][pos.y]){ cur.push({pos.x-1,pos.y}); vis[pos.x-1][pos.y]=1; dist[pos.x-1][pos.y]={dist[pos.x][pos.y].first,dist[pos.x][pos.y].second+1}; }// UP if(pos.y-1>=0) if(!vis[pos.x][pos.y-1]){ cur.push({pos.x,pos.y-1}); vis[pos.x][pos.y-1]=1; dist[pos.x][pos.y-1]={dist[pos.x][pos.y].first,dist[pos.x][pos.y].second+1}; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int k; char tmp; cin >> n >> m >> k; for(int y=0; y<n; ++y){ for(int x=0; x<m; ++x){ cin >> tmp; if(tmp=='X') vis[x][y]=1; //else vis[x][y]=0; } } bfs({0,0}); int mini=INT_MAX,il=1; pair<int,int> wynik; wynik={dist[m-1][n-1].first,dist[m-1][n-1].second}; // cout <<'x' << wynik.first << ' ' << wynik.second << '\n'; for(int i=0; i<k; ++i){ int a,b; cin >> a >> b; // cout << a*wynik.first+b*wynik.second << '\n'; const int odl=a*wynik.first+b*wynik.second; if(odl==mini){ ++il; }else if(odl<mini){ mini=odl; il=1; } } cout << mini << ' ' << il; return 0; } |