Cod sursă (job #143341)

Utilizator avatar spatarel Spatarel Dan-Constantin spatarel IP ascuns
Problemă Switch5 (lot liceu) Compilator cpp | 2,28 kb
Rundă Status evaluat
Dată 18 apr. 2015 01:49:46 Scor ascuns
#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);
}