Problem A. Mocha 上小班啦
签到题
#include<bits/stdc++.h>
using namespace std;
int main(){
string s = "1023456789";
int n; cin>>n;
if(n>10)cout<<-1;
else {
for(int i=0;i<n;i++)cout<<s[i];
}
return 0;
}
Problem F.集合之和
构造即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
if(n==1)cout<<"1\n1";
else if(n==2 || n==4)cout<<-1;
else {
int k = (n+2)/3;
cout<<k+1<<'\n';
for(int i=1;i<=k;i++) cout<<i<<' ';
if(n%3==0) cout<<2*k;
else if(n%3==2) cout<<2*k-1;
else cout<<2*k-2;
}
return 0;
}
Problem H.旋转水管
直接dfs就行:对每个位置的状态定义为能否从该位置到达终点
则该点的状态 = 它所能到的点的状态做或运算
ps:排除成环的情况,使用vis记录每个点是否被判断过,如果被重复判断直接返回0
state 用于记录上一步从哪里流进(这样才可以根据水管形状判断下一步可以流到哪里)
如果最终xx=4 yy=y则表示达到终点 return 1
#include<bits/stdc++.h>
using namespace std;
string s;
int x, y, m;
bool st[2][100010],a[2][100010];//s[0][i]=1 表示第2行第i个水管形状为I
bool dfs(int xx, int yy, int state){
bool flag;
if(xx==4 && yy==y)return 1;
if(xx<2 || xx>3 || yy<1 || yy>m || a[xx-2][yy])return 0;
a[xx-2][yy] = 1;
if(st[xx-2][yy]){
if(state==0)flag = dfs(xx+1,yy,0);
else if(state==1)flag = dfs(xx,yy-1,1);
else if(state==2)flag = dfs(xx-1,yy,2);
else flag = dfs(xx,yy+1,3);
}
else{
if(state==0 || state==2)flag = (dfs(xx,yy-1,1) || dfs(xx,yy+1,3));
else flag = (dfs(xx-1,yy,2) || dfs(xx+1,yy,0));
}
a[xx-2][yy] = 0;
return flag;
}
int main(){
int t; cin>>t;
while(t--){
cin >> m >> x >> y;
for(int i=0; i<2; i++){
cin >> s;
for(int j=1; j<=s.size(); j++){
st[i][j] = (s[j-1] == 'I' ? 1 : 0);
}
}
if(dfs(2,x,0)) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}