河工oj第七周补题题解2024

发布于:2024-12-08 ⋅ 阅读:(180) ⋅ 点赞:(0)

A.GO LecturesⅠ—— Victory

GO LecturesⅠ—— Victory - 问题 - 软件学院OJ

 代码

统计

#include<bits/stdc++.h>
using namespace std;

double b, w;

int main() {
	
	for(int i = 1; i <= 19; i ++) {
		for(int j = 1; j <= 19; j ++) {
			char ch; cin >> ch;
			if(ch == 'B') b ++;
			else w ++;
		}
	}
	if(b-7.5>w) puts("Black");
	else puts("White");
	return 0;
}

B.GO LecturesⅡ—— Liberty

GO LecturesⅡ—— Liberty - 问题 - 软件学院OJ

 

代码 

在所给的位置上就地搜索。dfs搜索四个方向。

#include<bits/stdc++.h>
using namespace std;

const int N = 50;
char g[N][N];
int vis[N][N];
int n;
int ans;
int dx[4] = {0,-1,0,1},dy[4] = {-1,0,1,0};

void dfs(int x, int y) {
	vis[x][y] = 1;
	
	for(int i = 0; i < 4; i ++) {
		int a = x+dx[i], b = y+dy[i];
		if(a<0||b<0||b>=n||a>=n) continue;
		if(!vis[a][b] && g[a][b]=='*') {
			ans ++, vis[a][b] = 1;
		}
		else if(!vis[a][b] && g[a][b] == g[x][y]) {
			dfs(a,b);
		}
	}
}

int main() {
	cin >> n;
	for(int i = 0; i < n; i ++) {
		for(int j = 0; j < n; j ++) {
			cin >> g[i][j];
		}
	}
	
	int x, y;
	cin >> x >> y;//下标从1开始的,偏移一下,我这从0开始输入 
	dfs(x-1,y-1);
	
	cout << ans << endl;
	return 0;
}

C.GO Lectures Ⅲ—— Gambling

 

代码 

第二个代码有解释。先处理!last再处理last,因为 last落子要除掉!last。

#include<bits/stdc++.h>
using namespace std;

const int N = 50;
char g[N][N];
int vis[N][N], num[N][N]; // 标记以及气数 
int cnt;

int dx[4] = {-1,0,1,0},dy[4] = {0,-1,0,1};

// 找某位置连通块气数
void dfs(int x,int y) {
	vis[x][y] = 1;
	
	for(int i = 0; i < 4; i ++) {
		int a = x+dx[i], b = y+dy[i];
		if(a<1||b<1||a>9||b>9) continue;
		
		if(!vis[a][b] && g[a][b]=='*') {
			cnt ++, vis[a][b] = 1;
		}
		else if(!vis[a][b] && g[a][b] == g[x][y]) 
			dfs(a,b);
	}
} 

int main() {
	char last; cin >> last;
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			cin >> g[i][j];
		}
	}
	
	// 找非last 气数以及替换
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			if(g[i][j] != last && g[i][j]!='*') {
				memset(vis,0,sizeof vis); cnt = 0;
				
				dfs(i,j); num[i][j] = cnt;
			}
		}
	} 
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			if(g[i][j]!=last && !num[i][j]) {
				g[i][j] = '*';
			}
		}
	}
	
	//last 气数以及替换
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			if(g[i][j]==last && g[i][j]!='*') {
				memset(vis,0,sizeof vis); cnt = 0;
				
				dfs(i,j); num[i][j] = cnt;
			}
		}
	} 
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			if(g[i][j]==last && !num[i][j]) {
				g[i][j] = '*';
			}
		}
	}
	
	// 输出
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			cout << g[i][j];
		}
		puts("");
	} 
	return 0;
}

加函数封装简短一点

#include<bits/stdc++.h>
using namespace std;

const int N = 50;
char g[N][N];
int vis[N][N], num[N][N];
int cnt;

int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};
//找气数 
void dfs(int x, int y) {
	vis[x][y] = 1;
	
	for(int i = 0; i < 4; i ++) {
		int a = x+dx[i], b = y+dy[i];
		if(a<1||b<1||a>9||b>9) continue;
		
		if(!vis[a][b] && g[a][b]=='*') {
			cnt ++, vis[a][b] = 1;
		}
		else if(!vis[a][b] && g[a][b]==g[x][y]) {
			dfs(a,b);
		}
	}
}
// 找ch气数
void find(char ch) {
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			if(g[i][j]==ch) { //三种元素多加一个!='*' 判断。
			//用函数封装了不加也可以,传newlast 
				memset(vis,0,sizeof vis); cnt = 0;
				dfs(i,j); num[i][j] = cnt;
			}
		}
	}
} 
//替换 ch
void solve(char ch) {
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			if(g[i][j]==ch && !num[i][j]) 
				g[i][j]= '*';
		}
	}
} 

int main() {
	char last; cin >> last;
	//要先处理非最后一个落子的,因为last 要除去 newlast 
	
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			cin >> g[i][j];
		}
	}
	char newlast;
	if(last == 'B') newlast = 'W';
	else newlast = 'B';
	
	find(newlast); solve(newlast);
	
	find(last); solve(last);
	
	// 处理完输出
	for(int i = 1; i <= 9; i ++) {
		for(int j = 1; j <= 9; j ++) {
			cout << g[i][j];
		}
		puts("");
	} 
	return 0;
}
 

D.1726: Advanced InferenceⅠ

Advanced InferenceⅠ - 问题 - 软件学院OJ

代码

对1取模都是0,满1为0。

#include<bits/stdc++.h>
using namespace std;

using ll = long long;

int main() {
	ll n, k;
	cin >> n >> k;
	cout << 0 << endl;
	return 0;
}

E.Advanced Inference Ⅱ

Advanced Inference Ⅱ - 问题 - 软件学院OJ

代码

常数的导数 是0

#include<bits/stdc++.h>
using namespace std;

using ll = long long;

int main() {
	ll n, k;
	cin >> n >> k;
	cout << 0 << endl;
	return 0;
}

F. Advanced Inference Ⅲ

Advanced Inference Ⅲ - 问题 - 软件学院OJ

代码 

n阶求导是 k*n! 

如果n < 10   k*n!

如果n>=10 k*n! 对n-2 取模是0,因为其中有(n-2) 因子

#include<bits/stdc++.h>
using namespace std;

using ll = long long;
ll n, k;
ll ans;

int main() {
	cin >> k >> n;
	if(n>=10) cout << 0 << endl;
	else {
		ans = k;
		for(int i = 1; i <= n; i ++) {
			ans *= i;
		}
		cout << ans << endl;
	}
	
	return 0;
}

G.Intemperance Ⅰ

Intemperance Ⅰ - 问题 - 软件学院OJ

代码 

#include<bits/stdc++.h>
using namespace std;

using ll = long long;
ll n, m;
const int N = 1e6+10;
ll a[N];


int main() {
	cin >> n >> m;
	ll w = 0, ans = 1;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	
	for(int i = 1; i <= n; i ++) { 
		if(w+a[i]<=m) {
			w += a[i];
		}
		else { // 当前满了 
			ans ++; 
			w = a[i];//更新重装本轮 
		}
	}
	
	cout << ans << endl;
	return 0;
}

H.Intemperance Ⅱ

Intemperance Ⅱ - 问题 - 软件学院OJ

代码 

#include<bits/stdc++.h>
using namespace std;

int n;
int sum = 0, length;
int main() {
	cin >> n;
	int t = n;
	for(int i = 1; sum <= n; i += 2,sum+=i) {
		length ++;
	}
	cout << length << endl;
	return 0;
}


网站公告

今日签到

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