Cod sursa(job #1731057)

Utilizator BabutaRaresBabuta Rares Mihai BabutaRares Data 18 iulie 2016 11:41:27
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>
#include<vector>
#include<cstdio>
#include<map>
using namespace std;
map< int, pair< int, int> > phone;
vector< pair <int, int> > moves;
pair< int, int> firstP;
int a[6][5];
int same(int i,int j)
{
    int i2 = i;
    int j2 = j;
    for(int k=0;k<moves.size();k++)
    {
        int ii = moves[k].first;
        int jj = moves[k].second;
        i = i + ii;
        j = j + jj;
        if(i<0 || i>5 || j<0 || j>4 || a[i][j] != 0)
        {
            return 0;
        }
    }
    return 1;
}
int sol()
{

    for(int i=0;i<6;i++)
    {
        a[i][0] = -1;
        a[i][4] = -1;
    }
    for(int j=0;j<5;j++)
    {
        a[0][j] = -1;
        a[5][j] = -1;
    }
    a[4][1] = -1;
    a[4][3] = -1;
    for(int i=1;i<=4;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(a[i][j] == 0 && (i!=firstP.first || j!=firstP.second))
            {
                if(same(i,j))
                {
                    return 1;
                }

            }
        }
    }
    return 0;
}

int main()
{

    //freopen("a.in","r",stdin);
    phone.insert(make_pair(1,make_pair(0,0)));
    phone.insert(make_pair(2,make_pair(0,1)));
    phone.insert(make_pair(3,make_pair(0,2)));
    phone.insert(make_pair(4,make_pair(1,0)));
    phone.insert(make_pair(5,make_pair(1,1)));
    phone.insert(make_pair(6,make_pair(1,2)));
    phone.insert(make_pair(7,make_pair(2,0)));
    phone.insert(make_pair(8,make_pair(2,1)));
    phone.insert(make_pair(9,make_pair(2,2)));
    phone.insert(make_pair(0,make_pair(3,1)));

    int n;
    cin>>n;
    char c;
    cin>>c;
    int last = c-'0';
    firstP = phone[last];
    firstP.first++;
    firstP.second++;
    n--;
    while(n>0)
    {
        n--;
        cin>>c;
        int current = c - '0';
        pair< int , int> lastPoz = phone[last];
        pair< int, int> currPoz = phone[current];
        int i = currPoz.first - lastPoz.first;
        int j = currPoz.second - lastPoz.second;
        moves.push_back(make_pair(i,j));
        last = current;
    }

    if(sol())
    {
        cout<<"NO\n";
    }
    else
    {
        cout<<"YES\n";
    }


    return 0;
}