SSブログ

AOJ 2190: Angel Stairs [AOJ]

階段を逆順に探索すると, 解が一意に定まるので, 簡単に問題が解けます. (ソースを三項にしてください.)

#include <stdio.h>

int convert(char *str)
{
    int ans;
    
    ans = (str[1] == '#');
    switch (str[0]){
      case 'D':
        ans += 2;
        break;
      
      case 'E':
        ans += 4;
        break;
      
      case 'F':
        ans += 5;
        break;
      
      case 'G':
        ans += 7;
        break;
      
      case 'A':
        ans += 9;
        break;
      
      case 'B':
        ans += 11;
        break;
    }
    
    return (ans);
}

int n, m;
int T[50000], S[50000];

int searchPath(int vertex, int cur)
{
    int ans;
    
    if (cur == 0){
        return (vertex == -1);
    }
    if (vertex < 0 || vertex >= n){
        return (0);
    }
    
    ans = 0;
    if (T[vertex] == S[cur - 1]){
        ans |= searchPath(vertex - 1, cur - 1);
    }
    if ((T[vertex] + 1) % 12 == S[cur - 1]){
        ans |= searchPath(vertex - 2, cur - 1);
    }
    if ((T[vertex] + 11) % 12 == S[cur - 1]){
        ans |= searchPath(vertex + 1, cur - 1);
    }
    
    return (ans);
}

int main(void)
{
    int t;
    int i, j;
    char in[4];
    
    scanf("%d", &t);
    
    while (t--){
        scanf("%d%d", &n, &m);
        
        for (i = 0; i < n; i++){
            scanf("%s", in);
            T[i] = convert(in);
        }
        for (i = 0; i < m; i++){
            scanf("%s", in);
            S[i] = convert(in);
        }
        
        if (searchPath(n - 1, m) | searchPath(n - 2, m)){
            printf("Yes\n");
        }
        else {
            printf("No\n");
        }
    }
    
    return (0);
}

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

[JOI合宿]2010-Day1:JOI..AtCoder Regular Cont.. ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。