AOJ 0033 深度优先搜索
题意:按给定顺序从A口放标号位1-10的10个球,利用挡板可以使球落到B或C,问能否使B和C里的球标号从下往上递增。
分析:对于第 i 个球,若a[i]大于B口上方的球,则可放入B口;若a[i]大于C口上方的球,则可放入C口。利用深度优先搜索,选取合适的操作,若能按要求放完10个球,则成功。若所有情况都不能,则失败。
C++代码:
/* input: 2 3 1 4 2 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 output: YES NO */ #include <cstdio> int a[10]; bool dfs(int k, int B, int C){ if(k == 10) return true; if(a[k] > B){ if(dfs(k + 1, a[k], C)) return true; } if(a[k] > C){ if(dfs(k + 1, B, a[k])) return true; } return false; } void solve(){ if(dfs(0, 0, 0)) printf("YES\n"); else printf("NO\n"); } int main(int argc, char const *argv[]){ int t; scanf("%d", &t); while(t --){ for(int i = 0; i < 10; i ++) scanf("%d", &a[i]); solve(); } return 0; }