Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Pirnog Theodor Ioan
- Colegiul National "B. P. Hasdeu"
- */
- #include <fstream>
- #include <queue>
- using namespace std;
- class InParser
- {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch()
- {
- ++sp;
- if(sp==4096)
- {
- sp=0;
- fread(buff,1,4096,fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume)
- {
- fin=fopen(nume,"r");
- buff=new char[4096]();
- sp=4095;
- }
- InParser& operator >> (int &n)
- {
- char c;
- while(!isdigit(c=read_ch())&&c!='-');
- int sgn=1;
- if (c=='-')
- {
- n=0;
- sgn=-1;
- }
- else
- {
- n=c-'0';
- }
- while(isdigit(c=read_ch()))
- {
- n=10*n+c-'0';
- }
- n*=sgn;
- return *this;
- }
- InParser& operator >> (long long &n)
- {
- char c;
- n=0;
- while(!isdigit(c=read_ch())&&c!='-');
- long long sgn=1;
- if(c=='-')
- {
- n=0;
- sgn=-1;
- }
- else
- {
- n=c-'0';
- }
- while(isdigit(c=read_ch()))
- {
- n=10*n+c-'0';
- }
- n*=sgn;
- return *this;
- }
- };
- class OutParser
- {
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch)
- {
- if(sp==50000)
- {
- fwrite(buff,1,50000,fout);
- sp=0;
- buff[sp++]=ch;
- }
- else
- {
- buff[sp++]=ch;
- }
- }
- public:
- OutParser(const char* name)
- {
- fout=fopen(name,"w");
- buff=new char[50000]();
- sp=0;
- }
- ~OutParser()
- {
- fwrite(buff,1,sp,fout);
- fclose(fout);
- }
- OutParser& operator <<(int vu32)
- {
- if(vu32<=9)
- {
- write_ch(vu32+'0');
- }
- else
- {
- (*this) <<(vu32/10);
- write_ch(vu32%10+'0');
- }
- return *this;
- }
- OutParser& operator <<(long long vu64)
- {
- if(vu64<=9)
- {
- write_ch(vu64+'0');
- }
- else
- {
- (*this) <<(vu64/10);
- write_ch(vu64%10+'0');
- }
- return *this;
- }
- OutParser& operator <<(char ch)
- {
- write_ch(ch);
- return *this;
- }
- OutParser& operator <<(const char *ch)
- {
- while(*ch)
- {
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- InParser cin("mindist.in");
- OutParser cout("mindist.out");
- const int NMAX = 1e3;
- int a[NMAX + 1][NMAX + 1], n, m, k, p1, p2;
- queue <pair <int, int>> q;
- int dl[] = {-1, 0, 1, 0};
- int dc[] = {0, 1, 0, -1};
- bool inside(int x, int y){
- return(x <= n && x >= 1 && y <= n && y >= 1);
- }
- void lee(int x, int y){
- a[x][y] = 1;
- q.push({x, y});
- while(!q.empty()){
- int f1 = q.front().first;
- int f2 = q.front().second;
- for(int i = 0; i < 4; i++){
- int iv = f1 + dl[i];
- int jv = f2 + dc[i];
- if(inside(iv, jv) && (!a[iv][jv] || a[f1][f2] + 1 < a[iv][jv])){
- a[iv][jv] = a[f1][f2] + 1;
- q.push({iv, jv});
- }
- }
- q.pop();
- }
- }
- int main(){
- cin >> n >> m >> k;
- for(int i = 1; i <= m; i++){
- cin >> p1 >> p2;
- a[p1][p2] = -1;
- }
- for(int i = 1; i <= k; i++){
- cin >> p1 >> p2;
- if(a[p1][p2] != -1)
- lee(p1, p2);
- }
- for(int i = 1; i <= n; i++){
- for(int j = 1; j <= n; j++){
- if(a[i][j] <= 0)
- cout << "-1 ";
- else if(a[i][j] != -1)
- cout << a[i][j] - 1 << " ";
- }
- cout << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement