2.1 最基础的"穷竭搜索" 深度优先搜索
有一个形似央视大楼(Orz)的筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B裤管或C裤管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B裤管和C裤管中的球从下往上标号递增。
输入:
第一行输入数据组数N。接下来N行为N组具体数据,每组数据中有10个整数,代表球的放入顺序。
输出:
对于每组数据,若策略存在,输出YES;若不存在,输出NO
Sample Input
2 3 1 4 2 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1
{ int n; cin >> n; while (n--) { int ball[10]; for (int i = 0; i < 10; ++i) { cin >> ball[i]; } bitset<10> direction; int all = 1024; while (all-- > 0) { direction = static_cast<bitset<10> >(all); bool perfect = true; int left = 0; int right = 0; for (int i = 0; i < 10; ++i) { if (direction[i]) { if (ball[i] > left) { left = ball[i]; } else { perfect = false; break; } } else { if (ball[i] > right) { right = ball[i]; } else { perfect = false; break; } } } if (perfect) { break; } } if (all >= 0) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0;}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; }Read full article from AOJ 0033 Ball《挑战程序设计竞赛(第2版)》练习题答案 � 码农场