AOJ 0033 Ball
题意
如下图所示,给你一排固定顺序的数,通过控制DE杆来控制小球掉落在B栏或者C栏,要求是BC栏中的顺序必须是依次增大的。问能否完成,能输出YES,否则输出NO。
思路:判断当前球能否放到左边或者右边,能就放入(两个都能就两个都做),如果不能的话递归自动结束,判断值为false。详细的看代码。
#include<iostream>
#include<cstring>
using namespace std;
int arr[11];
int l = 0, r = 0, flag = 0; //l,r用来记录左右栏最上面的值
void dfs(int t){ //t用来记录第几个球
if(t == 10){ //做到这一步说明所有的球都放完了
flag = 1;
return;
}
int back;
if(arr[t] >= l){
back = l;l = arr[t];
dfs(t + 1);
l = back; //递归完之后别忘了回溯
}
if(arr[t] >= r){ //这道题的数据应该有些问题,我之前这里用的else if也AC了
back = r;r = arr[t];
dfs(t + 1);
r = back;
}
}
int main(){
int T;
cin >> T;
while(T--){
memset(arr, -1, sizeof(arr));
for(int i = 0; i < 10; i++)
cin >> arr[i];
flag = 0;
dfs(0);
if(flag)cout << "YES" << endl;//之前还因为写成"Yes"Wa了。
else cout << "NO" << endl;
}
return 0;
}