题目链接:https://codeforces.com/contest/1234/problem/C
题目大意:根据规则,判断是否可以从左上走到右下,1,2,3,4,5,6分别对应题干给的图片,所以1,2是一类,3,4,5,6是一类。
思路:dfs,爆搜,用一个bool变量记录当前水流的 方向, 当遇到第一类时,如果当前是水平方向直接往右。当遇到第二类时,如果当前是竖直方向往右,如果是水平方向,则改变楼层;
AC代码:
#include<bits/stdc++.h> using namespace std; int t; bool flag=false ; string s1,s2; void dfs(int x,int y,int a){ if(flag) return ; if(x==2&&y==t){ flag=1; return ; } if(x==1){ if((s1[y]=='1'||s1[y]=='2')&&a) dfs(x,y+1,1); else if((s1[y]=='3'||s1[y]=='4'||s1[y]=='5'||s1[y]=='6')&&a) dfs(x+1,y,0); else if((s1[y]=='3'||s1[y]=='4'||s1[y]=='5'||s1[y]=='6')&&!a) dfs(x,y+1,1); } else { if((s2[y]=='1'||s2[y]=='2')&&a==1) dfs(x,y+1,1); else if((s2[y]=='3'||s2[y]=='4'||s2[y]=='5'||s2[y]=='6')&&a==1) dfs(x-1,y,0); else if((s2[y]=='3'||s2[y]=='4'||s2[y]=='5'||s2[y]=='6')&&!a==1) dfs(x,y+1,1); } } void solve(){ flag=false ; cin>>t; cin>>s1>>s2; dfs(1,0,1); if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } int main(){ int t; cin>>t; while(t--) solve(); return 0; }