当前位置: 代码迷 >> 综合 >> 【暑假复习】【搜索】AOJ0033:Ball
  详细解决方案

【暑假复习】【搜索】AOJ0033:Ball

热度:139   发布时间:2023-09-27 09:03:37.0

题意

将一个长度为10,包含0–9所有数字的数字串从头开始放入两个不同的数字串的末尾,要求这两个数字串从前往后递增。


题解

暴力地01枚举,分别考虑放第一个串或第二个,每次判断是否合法,放完即可返回。
复杂度2的n次方,n<=10,不会超时

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define SF scanf
#define PF printf
#define MAXN 20
using namespace std;
int num[MAXN],q,n=10;
stack<int> a,b;
int dfs(int x){if(x==n+1)return 1;int res=0;if(a.empty()||num[x]>a.top()){a.push(num[x]);res=max(res,dfs(x+1));a.pop();}if(b.empty()||num[x]>b.top()){b.push(num[x]);res=max(res,dfs(x+1));b.pop();}return res;
}
int main(){SF("%d",&q);while(q--){for(int i=1;i<=n;i++)SF("%d",&num[i]);if(dfs(1)==1)PF("YES\n");elsePF("NO\n");}
}