Problem:
J: 都 (City)

サンタはある都にプレゼントを届けることにした。

この都は南北 $H$ 区画 × 東西 $W$ 区画に分けられた長方形の形をしており、各区画にプレゼントを届ける家が 1 つずつある。

北から数えて $X$ 番目、西から数えて $Y$ 番目の区画を $(X, Y)$ で表す。

サンタは次の条件で移動する。

はじめに区画 $(S, T)$ に降り、この場所からスタートする。

1 回の移動で東西南北に隣り合う区画に移動でき、街の外には移動できない。

1 度訪ねた区画には、2 度と入らない。

サンタが都にあるすべての家を訪ねることができるか判定せよ。

入力

$H, W, S, T$が空白区切りで与えられる。

出力

サンタが都にあるすべての家を訪ねられる場合は "Yes"、そうでない場合は "No" と出力せよ。

制約

$H, W$ は $2$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

$S$ は $1$ 以上 $H$ 以下の整数

$T$ は $1$ 以上 $W$ 以下の整数

入力例1

4 5 2 3

出力例1

Yes

例えば、図の行き方をすれば良い。

入力例2

3 3 1 2

出力例2

No

Solution in C++14 (judge verdict: Accepted)

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#define REP(i,n) for(int i=0;i<(n);++i)
#define REPA(i,n) for(int i=1;i<(n);++i)
#define MOD ((int)1e9 + 7)
#define INF ((int)1e9)
#define ALL(x) (x).begin(),(x).end()
#define ctoi(x) (x - 'a') 
#define CTOI(x) (x - 'A')
using namespace std;
int mx[]={1,0,-1,0},my[]={0,1,0,-1};
bool check(int x,int y,vector<vector<char> > &map,int count){
    if(count == 0){
        return true;
    }
    REP(i,4){
        int nx = x + mx[i];
        int ny = y + my[i];
        if(nx == -1 || nx == map[0].size() || ny == -1 || ny == map.size() || !map[ny][nx])continue;
        map[ny][nx] = false;
        if(check(nx,ny,map,count - 1)){
            return true;
        }
        map[ny][nx] = true;
    }
    return false;
}
int main(){
    int H,W,S,T;
    cin >> H >> W >> S >> T;
    --S;
    --T;
    while(S > 3){
        S -= 2;
        H -=2;
    }
    while(T > 3){
        T -= 2;
        W -= 2;
    }
    while(H - S > 3){
        H -= 2;
    }
    while(W - T > 3){
        W -= 2;
    }
    vector<vector<char> > map(H,vector<char>(W));
    REP(i,H){
        REP(j,W){
            map[i][j] = true;
        }
    }
    map[S][T] = false;
    cout << (check(S,T,map,H*W-1)?"Yes":"No")<< endl;
    return 0;
}