2025年睿抗机器人开发者大赛CAIP-编程技能赛(省赛)-RoboCom 世界机器人开发者大赛-本科组

发布于:2025-07-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

 

RC-u1 早鸟价

代码
 

#include "bits/stdc++.h"
using namespace std;
int main(){
	int n;
	cin>>n;
	int m, d, q;
	while(n--){
		cin>>m>>d>>q;
		if(m > 7 || m == 7 && d > 11) {
			cout<<"Too late!"; 
		}
		else if(m < 6 || m == 6 && d <= 20) {
			if(q < 1800) cout<<"Need more!";
			else if(q == 1800) cout<<"Ok!" ;
			else cout<<"^_^"; 
		}
		else {
			if(q < 2000) cout<<"Need more!";
			else if(q == 2000) cout<<"Ok!" ;
			else cout<<"^_^";
		}
		cout<<endl;
	}
	return 0;
}

 RC-u2 谁进线下了?III

代码:

#include "bits/stdc++.h"
using namespace std;
int main(){
	int T;
	cin>>T;
	int n, s;
	int cnt = 0;
	int p, f;
	int summ = 0;
	while(T--){
		cin>>n>>s;
		int m = n;
		cnt = 0;
		summ = 0;
		while(m--){
			cin>>p>>f;
			if(p == 1) cnt ++;
			summ += f;
		}
		if(cnt >= n* 1.0 / 2) cout<<"1";
		else cout<<"0";
		cout<<" ";
		if(summ - s >= 50) cout<<"1";
		else cout<<"0";
		cout<<endl;
	}
	return 0;
}


 

 RC-u3 点格棋

思路:这题是个模拟,要注意的是判断条件,一是边界,二是下棋人的顺序,三是是否是相邻的格子,然后是连过的不能连,要注意的时候有可能一次连线拿两分,还有就是map如果结构体当键,无论是否里面的数据一样的,都会算成不同的键
代码:

#include "bits/stdc++.h"
using namespace std;
int n, m, s;
int mp[102][102][102][102] = {0};
int check(int x1, int y1, int x2, int y2){
	int score = 0;
	if(x1 == x2){
		if(x1 - 1 >= 1){
			if(mp[x1 - 1][y1][x1][y1] && mp[x1 - 1][y2][x1][y2] && mp[x1 - 1][y1][x1 - 1][y2])
			score++;			
		}
		if(x1 + 1 <= n ){
			if(mp[x1 + 1][y1][x1][y1] && mp[x1 + 1][y2][x1][y2] && mp[x1 + 1][y1][x1 + 1][y2] )
			score++;	
		}	
	}
	else if(y1 == y2){
		if(y1 - 1 >= 1){
			if(mp[x1][y1- 1][x1][y1] && mp[x1 ][y1 - 1][x2][y2- 1] && mp[x2][y2 - 1][x2][y2] )
			score++;
		}
		if(y1 + 1 <= m ){
			if(mp[x1][y1 + 1][x1][y1] && mp[x1 ][y1 + 1][x2][y2+ 1] && mp[x2][y2 + 1][x2][y2])
			score++;
		}
		
	}
	return score;
}
int main(){
	cin>>n>>m>>s;
	int a, x1, y1, x2, y2; 
	vector<int> v;
	int cnt = 0;
	int A = 0, B = 0;
	int next = 0;
	for(int i = 1; i <= s; i ++){
		cin>>a>>x1>>y1>>x2>>y2;
		if(a == next && x1 >= 1 && y1 >= 1 && x2 >= 1 && y2 >= 1 && x1 <= n && x2 <= n && y1 <= m && y2 <= m&&(abs(x1 - x2 )+abs(y1 - y2) == 1)&&!mp[x1][y1][x2][y2] && (x1 == x2 || y1 == y2)){
			mp[x1][y1][x2][y2] = 1;
			mp[x2][y2][x1][y1] = 1;
			int f = check(x1, y1, x2, y2);
			if(f == 0) next = 1 - next;
			if(a == 0) A += f;	
			else B += f;	
		} 
		else v.push_back(i),cnt ++;	
	}
	if(cnt == 0) cout<<-1;
	else 
		for(int i = 0; i < v.size();i  ++){
			cout<<v[i];
			if(i != v.size() - 1) cout<<" ";
		}	
	cout<<endl;
	if(A > B) cout<<0<<" "<<A;  
	else cout<<1<<" "<<B;
	return 0;
} 

 RC-u4 Tree Tree 的

思路:很明显是找环,一个最大的,一个次大的,但是注意他这个图不一定是连通的,也就是说你从一个点开始dfs可能遍历不到所有的点。我这里用了一个dfs来进行判断,也就是一个dfs找一个连通图中所有的环。
代码:

#include "bits/stdc++.h"
using namespace std;
vector<int> g[15];
int ans1 = 1, ans2 = 0;
int pre[60], vis[20], vis1[20];
void dfs(int x, int p){
	vis[x] = 1;
	vis1[x] = 1;
	for(int i = 0; i < g[x].size(); i ++){
		int t = g[x][i]; 
		vis1[t] = 1;
		if(vis[t]) {
			int cnt = 1;
			int xx = x;
			while( xx != t){
				xx = pre[xx];
				cnt ++;
			}
			if(cnt > ans1){
				ans2 = ans1;
				ans1 = cnt;		
			}
			if(cnt < ans1 && cnt > ans2){
				ans2 = cnt;
			} 
		} 		
		else if(t == p) continue; 
		else if(!vis[t]){
			pre[t] = x;
			dfs(t, x);
		} 	
	}
	vis[x] = 0;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		int n, m, x, y;
		cin>>n>>m;
		memset(vis, 0, sizeof(vis));
		memset(vis1, 0, sizeof(vis1));
		memset(pre, 0, sizeof(pre));
		for(int i = 0; i < 11; i ++) g[i].clear();
		while(m--){
			cin>>x>>y;
			g[x].push_back(y);
			g[y].push_back(x);
		}
		ans1 = 1;
		ans2 = 0;
		for(int i = 1; i <= n; i ++)
			if(!vis1[i]) dfs(i, -1);
		cout<<ans1<<" "<<ans2<<endl;
	}
	return 0;
}

 RC-u5 游戏设计师

思路:这题大模拟,耐心做一下就好了,细节比较多,然后的话他这个你注意是1是实心格子,2是易碎格子,直接模拟的话能拿22分,后面两个超时,这时候会想到(我看大家好像都想到了哈哈,本来以为是剪枝但是感觉没有什么好剪得)直接从终点开始遍历就能打表所有的可能了,再多询问也是O(1), 遍历的话直接bfs就可以了,这里注意可能一开始就在终点,这是第1个测试点一分。

代码:

#include "bits/stdc++.h"
using namespace std;
const int N  = 1e3 + 10;
int n, m;
int g[N][N];
int vis[4][1001][1001];
int ex = -1, ey = -1;
struct node{
	int op;
	int x, y;
	int dis;
	node(int a, int b, int c, int e){
		op = a, x = b, y = c, dis = e;
	}
};
queue<node> q;
void bfs(int op, int x, int y){
	int x1, y1, x2, y2;
	if(op == 0)
		q.push(node(0, x, y,  0));
	else if(op == 1){
		q.push(node(1, x, y,  0));
	}
	else {
		q.push(node(2, x, y,  0));
	}
	int opp = -1;
	while(q.size()){
		node t = q.front();
		q.pop();
		int op1 = t.op;
		if(op1 == 0){
			x1 = t.x - 1, x2 = t.x - 2, y1 = t.y, y2 = t.y, opp = 2;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x2][y1] &&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(2, x2, y1, t.dis + 1));
				vis[opp][x2][y1] = t.dis + 1;
			}
			x1 = t.x + 1, x2 = t.x + 2, y1 = t.y, y2 = t.y, opp = 2;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1]&&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(2, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x, x2 = t.x, y1 = t.y + 1, y2 = t.y + 2, opp = 1;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] &&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(1, x1, y1,  t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x, x2 = t.x, y1 = t.y - 1, y2 = t.y - 2, opp = 1;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x2][y2] &&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(1, x2, y2, t.dis + 1));
				vis[opp][x2][y2] = t.dis + 1;
			}
		}
		else if(op1 == 1){
			x1 = t.x - 1, x2 = t.x - 1, y1 = t.y, y2 = t.y + 1, opp = 1;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] &&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(1, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x + 1, x2 = t.x + 1, y1 = t.y, y2 = t.y + 1, opp = 1;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] &&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(1, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x, x2 = 0, y1 = t.y - 1, y2 =  0, opp = 0;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] && (g[x1][y1] == 1 || g[x1][y1] == 3)){
				q.push(node(0, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x, x2 = 0, y1 = t.y + 2, y2 =  0, opp = 0;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] && (g[x1][y1] == 1|| g[x1][y1] == 3)){
				q.push(node(0, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
		}
		else if(op1 == 2){
			x1 = t.x , x2 = t.x + 1, y1 = t.y - 1, y2 = t.y - 1, opp = 2;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] &&  (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(2, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x, x2 = t.x + 1, y1 = t.y + 1, y2 = t.y + 1, opp = 2;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] && (g[x1][y1] == 1  || g[x1][y1] == 2)&& (g[x2][y2] == 1 || g[x2][y2] == 2)){
				q.push(node(2, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x - 1, x2 = 0, y1 = t.y, y2 =  0, opp = 0;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] && (g[x1][y1] == 1|| g[x1][y1] == 3)){
				q.push(node(0, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
			x1 = t.x + 2, x2 = 0, y1 = t.y, y2 =  0, opp = 0;
			if(x1 >= 0 && x1 < n && x2 >= 0 && x2 < n && y1 >= 0 && y1 < m && y2 >= 0 && y2 < m && !vis[opp][x1][y1] && (g[x1][y1] == 1|| g[x1][y1] == 3)){
				q.push(node(0, x1, y1, t.dis + 1));
				vis[opp][x1][y1] = t.dis + 1;
			}
		}
	}
	
}
int main(){
	cin>>n>>m;
	int q;
	for(int i = 0; i < n; i ++){
		for(int j = 0; j < m; j ++){
			scanf("%1d", &g[i][j]);
			if(g[i][j] == 3){
				ex = i, ey = j;
			}
		} 
	}
	cin>>q;
	int x, y, op;
	bfs(0, ex, ey);
	while(q--){
		cin>>x>>y>>op;
		if(vis[op][x - 1][y - 1] || (op == 0 && x - 1 == ex && y - 1 == ey))
			cout<<vis[op][x - 1][y - 1]<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到