Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

Alternate Escape

アリスハウス

AliceとBobはボードゲームで遊んでいる．
このボードゲームは， H 行 W 列のマス目が書かれた盤面と1つのコマを使って遊ぶ．
このゲームでは，盤面の左上のマスを1行1列目として，下方向に行を，右方向に列を数える．

マス同士が隣接する辺と，マスが盤面の外側と接する辺には壁を置けるようになっていて，ゲームの開始時にはそれぞれの辺について壁の有無が指定されている．また，ゲームの開始時には，コマが盤面のマスのいずれか1箇所に置かれている．

AliceとBobは交互に手番をこなすことでゲームを進める．
ゲームはAliceの手番から始まる．
Aliceの目的は，コマを盤面の外まで動かして，迷路から脱出させることである．
Aliceが1手でできる行動は，コマを今ある位置のマスから，上下左右に隣接するマスのうち，間の辺に壁がない方向のいずれかに移動させることである．
コマの今あるマスが盤面の外側に接していて，間の辺に壁がない場合，そこからコマを脱出させることができる．

一方，Bobの目的は，コマの脱出を妨害することである．
Bobの手番では，壁の有無を反転させるか，何もせずに手番を終えるかを選ぶことができる．
壁の有無を反転させることを選んだ場合，盤面のすべてのマスの辺について，壁の有無が反転する．

盤面の初期状態と，コマの初期位置が与えられるので，AliceとBobの両者が最適な行動をとったときに，Aliceがコマを盤面から脱出させられるか判定せよ．
ただし，Aliceの手番においてコマが4方向とも壁で囲まれてしまった場合は脱出できないとみなす．

Input

入力は40個以下のデータセットからなる．
それぞれのデータセットは次の形式で与えられる．

H W R C
 Horz1,1 Horz1,2 ... Horz1,W
Vert1,1 Vert1,2 ... Vert1,W+1
...
VertH,1 VertH,2 ... VertH,W+1
 HorzH+1,1 HorzH+1,2 ... HorzH+1,W

1行目には4つの整数 H, W (1 ≤ H, W ≤ 500), R, C (1 ≤ R ≤ H, 1 ≤ C ≤ W) が与えられる．
これらは盤面が H 行 W 列のマス目からなり，コマの初期位置が R 行 C 列目であることを表す．

続く 2H + 1 行には盤面の初期状態が与えられる．

2i 行目 (1 ≤ i ≤ H + 1) は，W個の整数 Horzi,1, Horzi,2, ..., Horzi,Wを含む．
Horzi,jは，i 行 j 列目のマスの上側の辺に壁が有るとき1で，無いとき0である．
ただし，HorzH+1,jは， H 行 j 列目のマスの下側の辺における壁の有無を表す．

2i + 1 行目 (1 ≤ i ≤ H) は，W + 1 個の整数 Verti,1, Verti,2, ..., Verti,W+1を含む．
Verti,jは， i 行 j 列目のマスの左側の辺に壁が有るとき1で，無いとき0である．
ただし，Verti,W+1は， i 行 W 列目のマスの右側の辺における壁の有無を表す．

入力の終わりは，4つのゼロからなる1行で示される．

Output

それぞれのデータセットについて，Aliceがコマを盤面から脱出させられる場合は"Yes"，できない場合は"No"と1行に出力せよ．

Sample Input

3 3 2 2
1 1 1
0 0 0 0
1 1 1
0 0 0 0
1 1 1
0 0 0 0
1 1 1
3 3 2 2
1 0 1
1 0 1 1
1 0 0
0 0 0 0
0 0 1
1 1 0 1
1 0 1
1 3 1 1
1 1 1
1 0 0 1
1 0 1
2 2 1 1
1 0
1 0 0
0 0
0 0 0
0 0
0 0 0 0

Output for Sample Input

Yes
No
Yes
No

Hint

1つ目のデータセットではAliceは次のように動くことでコマを脱出させられる。

初期状態

Aliceがコマを左に動かす

Bobは脱出を阻止するために壁を反転させる

Aliceがコマを上に動かす

Bobが次の手番で壁の有無を反転させてもさせなくても、
Aliceは次の手番でコマを脱出させられる。

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

#include<deque>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<tuple>
#include<string>
#include<chrono>
#include<functional>
#include<iterator>
#include<random>
#include<unordered_set>
#include<array>
#include<map>
#include<iomanip>
#include<assert.h>
#include<list>
#include<bitset>
#include<stack>
#include<memory>
#include<numeric>
using namespace std;
using namespace std::chrono;
typedef long long int llint;
typedef long double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase
/*cout<<fixed<<setprecision(20);cin.tie(0);ios::sync_with_stdio(false);*/
const llint mod=1000000007;
const llint big=2.19e15+1;
const long double pai=3.141592653589793238462643383279502884197;
const long double eps=1e-12;
template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;}
template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;}
llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);}
llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;}
template<class T> void SO(T& ve){sort(ve.begin(),ve.end());}
template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());}
template<class T>llint LBI(const vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();}
template<class T>llint UBI(const vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();}
bool solve(void){
	int h,w,r,c,i,j,x,y;cin>>h>>w>>r>>c;
	if(h==0){return false;}
	static char ma[1003][1003];
	int hs=h*2+2,ws=w*2+2;
	for(x=0;x<=ws;x+=2){ma[0][x]=7;ma[hs][x]=7;}//脱出可能
	for(y=0;y<=ws;y+=2){ma[y][0]=7;ma[y][ws]=7;}//脱出可能
	for(y=2;y<hs;y+=2){for(x=2;x<ws;x+=2){ma[y][x]=0;}}
	for(y=1;y<hs;y++){
		for(x=y%2+1;x<ws;x+=2){cin>>ma[y][x];ma[y][x]-='0';}
	}
	for(x=2;x<ws;x+=2){
		if(ma[1][x]){ma[2][x]|=2;}else{ma[2][x]|=1;}
		if(ma[hs-1][x]){ma[hs-2][x]|=2;}else{ma[hs-2][x]|=1;}
	}
	for(y=2;y<hs;y+=2){
		if(ma[y][1]){ma[y][2]|=2;}else{ma[y][2]|=1;}
		if(ma[y][ws-1]){ma[y][ws-2]|=2;}else{ma[y][ws-2]|=1;}
	}
	queue<pair<int,int>>que;
	for(y=2;y<hs;y+=2){
		for(x=2;x<ws;x+=2){
			if(ma[y][x]==3){ma[y][x]=7;que.push(mp(y,x));}
		}
	}
	while(que.size()){
		tie(y,x)=que.front();que.pop();
		//cerr<<y<<" "<<x<<endl;
		if(ma[y-1][x]){ma[y-2][x]|=2;}else{ma[y-2][x]|=1;}
		if(ma[y-2][x]==3){ma[y-2][x]=7;que.push(mp(y-2,x));}
		if(ma[y+1][x]){ma[y+2][x]|=2;}else{ma[y+2][x]|=1;}
		if(ma[y+2][x]==3){ma[y+2][x]=7;que.push(mp(y+2,x));}
		if(ma[y][x-1]){ma[y][x-2]|=2;}else{ma[y][x-2]|=1;}
		if(ma[y][x-2]==3){ma[y][x-2]=7;que.push(mp(y,x-2));}
		if(ma[y][x+1]){ma[y][x+2]|=2;}else{ma[y][x+2]|=1;}
		if(ma[y][x+2]==3){ma[y][x+2]=7;que.push(mp(y,x+2));}
	}
	y=r*2;x=c*2;
	if(ma[y-1][x]==0&&ma[y-2][x]==7){cout<<"Yes"<<endl;return true;}
	if(ma[y+1][x]==0&&ma[y+2][x]==7){cout<<"Yes"<<endl;return true;}
	if(ma[y][x-1]==0&&ma[y][x-2]==7){cout<<"Yes"<<endl;return true;}
	if(ma[y][x+1]==0&&ma[y][x+2]==7){cout<<"Yes"<<endl;return true;}
	cout<<"No"<<endl;return true;
}
int main(void){
	cout<<fixed<<setprecision(20);cin.tie(0);ios::sync_with_stdio(false);
	while(solve()){}
	return 0;
}