Pagini recente »
2019-12-19-test-7-1
|
Diferențe pentru runda/2019-01-17-clasa-6-tema-15 între reviziile 1 și 2
|
Istoria paginii utilizator/wladdalwm
|
Profil anisia
|
Cod sursă (job #143341)
Cod sursă (job
#143341)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#define ecuatie vector<int>
using namespace std;
ecuatie operator+(ecuatie,ecuatie);
int n,k,i,j,sol[10010];
ecuatie e[10010],ec;
vector<int> EN[10010],EO[10010];
void reset_new(int),reset_old(int);
int main()
{
freopen("switch5.in","r",stdin);
freopen("switch5.out","w",stdout);
scanf("%d",&n);
k=n*n;
for(i=1;i<=k;i++)
{
if(i-n>0)e[i].push_back(i-n);
if((i-1)%n)e[i].push_back(i-1);
e[i].push_back(i);
if(i%n)e[i].push_back(i+1);
if(i+n<=k)e[i].push_back(i+n);
e[i].push_back(k+1);
EN[e[i].front()].push_back(i);
}
for(i=1;i<=k;i++)
{
//fprintf(stderr,"%d\n",i);
if(EN[i].size()==0)
{
sol[i]=0;
ec.resize(0);
ec.push_back(i);
for(vector<int>::iterator it=EO[i].begin();it!=EO[i].end();it++)
{
e[*it]=e[*it]+ec;
reset_old(*it);
}
continue;
}
j=EN[i].back();EN[i].pop_back();
for(vector<int>::iterator it=EO[i].begin();it!=EO[i].end();it++)
{
e[*it]=e[*it]+e[j];
reset_old(*it);
}
for(vector<int>::iterator it=EN[i].begin();it!=EN[i].end();it++)
{
e[*it]=e[*it]+e[j];
reset_new(*it);
}
reset_old(j);
}
for(i=1;i<=k;i++)
{
printf("%d",sol[i]);
if(i%n==0)printf("\n");
}
return 0;
}
ecuatie operator+(ecuatie A,ecuatie B)
{
ecuatie R;
R.resize(0);
ecuatie::iterator a,b;
for(a=A.begin(),b=B.begin();a!=A.end()&&b!=B.end();)
{
if(*a<*b){R.push_back(*a);a++;}
else
if(*b<*a){R.push_back(*b);b++;}
else {a++;b++;}
}
for(;a!=A.end();a++)R.push_back(*a);
for(;b!=B.end();b++)R.push_back(*b);
return R;
}
void reset_old(int i)
{
//se reseteaza o ecuatie stiind ca prima variabila este necunoscuta principala
if(e[i].size()==1){sol[e[i][0]]=0;return;}
if(e[i][1]==k+1){sol[e[i][0]]=1;return;}
EO[e[i][1]].push_back(i);
}
void reset_new(int i)
{
if(e[i].size()==0)return;
EN[e[i][0]].push_back(i);
}