There is a tube, from a can play ball, put in the ball can be through the baffle de to fall into the B-tube or C-tube, the existing 1-10-marking ball in the given order from a mouth, ask whether there is a control of the baffle strategy can make B-tube and C-tube ball from the bottom to the upper marking increment.
Input:
The first row of input data group N. Next n behavior n sets of specific data, each set of data has 10 integers, which represent the order in which the ball is placed.
Output:
For each set of data, if the policy exists, the output is yes;
Solution 1:dfs
Idea: Each time to determine whether the current ball is larger than the top of the left container of the ball, if you can put, otherwise go to see the right. Once found on both sides can not put, it can only be judged to be no.
#include <cstdio> #include <string> #include <iostream> #include <cstring> #include < Algorithm>using namespace Std;typedef long long ll;const int INF = 0x7fffffff;const int MAXN = 1e5 + 10; int a[11],vis[11],flag;void dfs (int x,int l,int r) { int i; if (x==11) return; if (flag) return; if (a[x]>l) DFS (x+1,a[x],r); else if (a[x]>r) DFS (x+1,l,a[x]); Else{flag=1;return;}} int main () { int t,i,j,k; scanf ("%d", &t); while (t--) { flag=0; for (i=1;i<=10;i++) scanf ("%d", &a[i]); memset (vis,0,sizeof (Vis)); DFS (1,0,0); if (flag) printf ("no\n"); else printf ("yes\n"); } return 0;}
Solution 2: Binary Enumeration
Thought: as 0,1 sequence
#include <cstdio> #include <cstring>int a[15], l[15], r[15], T, I, J, LC, RC, Cnt;bool vis[15], Flag;bool solve () {for (i = 0; i < 1024x768; ++i) {memset (l, 0, sizeof (l)), memset (r, 0, sizeof (R)), LC = RC = 0;for (cnt = 0, j = i; CNT < 1 0; ++cnt, J >>= 1) {if (J & 1) l[lc++] = A[cnt];else r[rc++] = a[cnt];} Flag = true;for (j = 1; j < LC; ++j) if (L[j] < l[j-1]) {flag = False;break;} if (flag) for (j = 1; j < RC; ++j) if (r[j-1] > R[j]) {flag = False;break;} if (flag) return true; return false;} int main () {scanf ("%d", &t), while (t--) {memset (Vis, 0, sizeof (VIS)), and for (i = 0; i < ++i) scanf ("%d", &a[i]);p UTS (Solve ()? "YES": "NO");} return 0;}
Bitset Enhanced Version
#include <iostream> #include <bitset> #include <algorithm>using namespace std; int main () {int n;cin >> n;while (n--) {int ball[10];for (int i = 0; i < ++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 <, ++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;}
AOJ 0033 Ball "DFS"