Problem Solving

[USACO] 첫째날 6문제 풀이

끄적끄적 2008. 10. 9. 17:46


어제 SRM이 있기전에 ACRush를 통해 알게된 USACO를 가봤다.

알고리즘 공부를 시작하는 사람들에게 추천한다고 해서 문제 몇개를 풀어봤는데, 문제들이 다들 괜찮은거 같다.
당분간 USACO의 문제들을 풀면서 연습을 해야겠음.

그런데, 여기는 단계에 문제를 못풀면 다음 단계로 넘어가질 못한다..ㄷㄷ;

오늘은 특별히 막히는 문제없이 6문제 풀이완료.

TC에서 easy문제들을 좀 풀었던게 연습이 되서 그런지 쉬운 문제들은 금방 풀수 있는 자신감이 생기는거 같다.



그중에 마지막 문제였던
Transformations 풀이 소스를 기록.
90도, 180도, 270도를 각각 구현을 해놨는데, 90도 하나만 짜놓고, 여러번 호출하는 방법도 있었다.

vector<string> lotate(vector<string> d, int num)
{
    vector<string> ret = d;
    int n = d.size();
    if( num == 1)
    {
        REP(i, n)
        {
            string s;
            REP(j, n) s += d[n-1-j].substr(i, 1);
            ret[i] = s;
        }
    }
    else if( num == 2)
    {
        REP(i, n)
        {
            string s;
            REP(j, n) s += d[n-1-i].substr(n-1-j, 1);
            ret[i] = s;
        }
    }
    else if( num == 3)
    {
        REP(i, n)
        {
            string s;
            REP(j, n) s += d[j].substr(n-1-i, 1);
            ret[i] = s;
        }
    }
    else if( num == 4)
    {
        REP(i, n)
        {
            string s;
            int odd = n%2;
            string s1 = d[i].substr(0, n/2);
            string s2 = d[i].substr(n/2+odd, n/2);
            reverse(ALL(s1));
            reverse(ALL(s2));

            s += s2;
            if(odd) s += d[i].substr(n/2, 1);
            s += s1;
            ret[i] = s;
        }
    }

    return ret;

}

int main() {

    ofstream fout ("transform.out");
    ifstream fin ("transform.in");
   
    int n, ok = 0;
    string s;
    fin >> n ;
    vector<string> d;
    vector<string> out;
    REP(i, n)
    {
        fin >> s; d.pb(s);
    }
    REP(i, n)
    {
        fin >> s; out.pb(s);
    }

    vector<string> t = d;

    if( lotate(t, 1) == out ) fout << 1 << endl;
    else if( lotate(t, 2) == out ) fout << 2 << endl;
    else if( lotate(t, 3) == out ) fout << 3 << endl;
    else if( lotate(t, 4) == out ) fout << 4 << endl;
    else if( lotate(lotate(t, 4), 1) == out || lotate(lotate(t, 4), 2) == out || lotate(lotate(t, 4), 3) == out)
        fout << 5 << endl;
    else if( t == out) fout << 6 << endl;
    else fout << 7 << endl;

    return 0;
}

반응형