#include <stdio.h> #include <queue> struct pole { int wart; int wsp; char znak; }; struct pole mapa[2002][2002]; int n,m,k; int min(int a, int b) { if(a<b) return a; else return b; } void wczytaj_mape() { int x,y; char z; scanf("%d %d %d\n",&n,&m,&k); for(y=1;y<=n;++y) for(x=1;x<=m;++x) { if(x==m) scanf("%c\n",&z); else scanf("%c",&z); if (z=='X') mapa[x][y].znak=z; else mapa[x][y].znak=0; mapa[x][y].wsp=2048*y+x; mapa[x][y].wart=0; } return; } int opt_path(void) { std::queue<int> kolejka; int x,y,r; int W; x=m; y=n; if (mapa[x-1][y].znak!='X') kolejka.push(mapa[x-1][y].wsp); if (mapa[x][y-1].znak!='X') kolejka.push(mapa[x][y-1].wsp); mapa[x][y].znak=5; while(!kolejka.empty()) { W=kolejka.front(); kolejka.pop(); x=W%2048; y=W/2048; r=5000000; if(x>1 && mapa[x-1][y].znak>4 && mapa[x-1][y].znak!='X') r=min(r,mapa[x-1][y].wart); if(x>1 && mapa[x-1][y].znak!='X' && mapa[x-1][y].znak<4) {kolejka.push(mapa[x-1][y].wsp); mapa[x-1][y].znak++;} if(x<m && mapa[x+1][y].znak>4 && mapa[x+1][y].znak!='X') r=min(r,mapa[x+1][y].wart); if(x<m && mapa[x+1][y].znak!='X' && mapa[x+1][y].znak<4) {kolejka.push(mapa[x+1][y].wsp); mapa[x+1][y].znak++;} if(y>1 && mapa[x][y-1].znak>4 && mapa[x][y-1].znak!='X') r=min(r,mapa[x][y-1].wart); if(y>1 && mapa[x][y-1].znak!='X' && mapa[x][y-1].znak<4) {kolejka.push(mapa[x][y-1].wsp); mapa[x][y-1].znak++;} if(y<n && mapa[x][y+1].znak>4 && mapa[x][y+1].znak!='X') r=min(r,mapa[x][y+1].wart); if(y<n && mapa[x][y+1].znak!='X' && mapa[x][y+1].znak<4) {kolejka.push(mapa[x][y+1].wsp); mapa[x][y+1].znak++;} mapa[x][y].wart=r+1; mapa[x][y].znak=5; } return mapa[1][1].wart; } void rob_reszte(int r) { int a,b,up,down,l; long long int t,tmin; up=(n+m+r)/2-1; down=r-up; tmin=9223372036854775800; l=0; while(k--) { scanf("%d %d",&a,&b); t=(long long int)a * (long long int)up + (long long int)b * (long long int)down; if(t<tmin) {l=1; tmin=t;} else if(t==tmin) l++; } printf("%lld %d\n",tmin,l); return; } int main() { int x,y; wczytaj_mape(); x=opt_path(); rob_reszte(x); 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include <stdio.h> #include <queue> struct pole { int wart; int wsp; char znak; }; struct pole mapa[2002][2002]; int n,m,k; int min(int a, int b) { if(a<b) return a; else return b; } void wczytaj_mape() { int x,y; char z; scanf("%d %d %d\n",&n,&m,&k); for(y=1;y<=n;++y) for(x=1;x<=m;++x) { if(x==m) scanf("%c\n",&z); else scanf("%c",&z); if (z=='X') mapa[x][y].znak=z; else mapa[x][y].znak=0; mapa[x][y].wsp=2048*y+x; mapa[x][y].wart=0; } return; } int opt_path(void) { std::queue<int> kolejka; int x,y,r; int W; x=m; y=n; if (mapa[x-1][y].znak!='X') kolejka.push(mapa[x-1][y].wsp); if (mapa[x][y-1].znak!='X') kolejka.push(mapa[x][y-1].wsp); mapa[x][y].znak=5; while(!kolejka.empty()) { W=kolejka.front(); kolejka.pop(); x=W%2048; y=W/2048; r=5000000; if(x>1 && mapa[x-1][y].znak>4 && mapa[x-1][y].znak!='X') r=min(r,mapa[x-1][y].wart); if(x>1 && mapa[x-1][y].znak!='X' && mapa[x-1][y].znak<4) {kolejka.push(mapa[x-1][y].wsp); mapa[x-1][y].znak++;} if(x<m && mapa[x+1][y].znak>4 && mapa[x+1][y].znak!='X') r=min(r,mapa[x+1][y].wart); if(x<m && mapa[x+1][y].znak!='X' && mapa[x+1][y].znak<4) {kolejka.push(mapa[x+1][y].wsp); mapa[x+1][y].znak++;} if(y>1 && mapa[x][y-1].znak>4 && mapa[x][y-1].znak!='X') r=min(r,mapa[x][y-1].wart); if(y>1 && mapa[x][y-1].znak!='X' && mapa[x][y-1].znak<4) {kolejka.push(mapa[x][y-1].wsp); mapa[x][y-1].znak++;} if(y<n && mapa[x][y+1].znak>4 && mapa[x][y+1].znak!='X') r=min(r,mapa[x][y+1].wart); if(y<n && mapa[x][y+1].znak!='X' && mapa[x][y+1].znak<4) {kolejka.push(mapa[x][y+1].wsp); mapa[x][y+1].znak++;} mapa[x][y].wart=r+1; mapa[x][y].znak=5; } return mapa[1][1].wart; } void rob_reszte(int r) { int a,b,up,down,l; long long int t,tmin; up=(n+m+r)/2-1; down=r-up; tmin=9223372036854775800; l=0; while(k--) { scanf("%d %d",&a,&b); t=(long long int)a * (long long int)up + (long long int)b * (long long int)down; if(t<tmin) {l=1; tmin=t;} else if(t==tmin) l++; } printf("%lld %d\n",tmin,l); return; } int main() { int x,y; wczytaj_mape(); x=opt_path(); rob_reszte(x); return 0; } |