社区讨论

10分求调

P3663[USACO17FEB] Why Did the Cow Cross the Road III S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhj022aq
此快照首次捕获于
2025/11/03 18:31
4 个月前
此快照最后确认于
2025/11/03 18:31
4 个月前
查看原帖
CPP
#include<iostream>
#include<vector>
#include<utility>
#include<queue>
#include<cstring>
using namespace std;
bool blocked[105][105][105] = {false};
//farmland(i,j) has a barrier on direction k
int mapp[105][105];
//farmland(i,j) has no.k cow
pair<int, int> cows[105];
//the no.i cow sits on (first,second)
int viscow[105];
//in this round, no.i has been visited yet?
bool vispath[105][105];
int colors[105] = {0};
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
int n,k,r;
int color = 1;
void bfs(int cur){
	queue<pair<int, int> > q;
	q.push(cows[cur]);
	viscow[cur] = color;
	while(!q.empty()){
		int sx = q.front().first;
		int sy = q.front().second;
		for(int i=0;i<4;i++){
			int nx = sx+dx[i];
			int ny = sy+dy[i];
			if(blocked[sx][sy][i]){
				continue;
			}
			if(nx<0 || ny<0 || nx>n || ny>n){
				continue;
			}
			if(vispath[nx][ny]){
				continue;
			}
			if(mapp[nx][ny]!=-1 && mapp[nx][ny]<=cur){
				continue;
			}
			if(mapp[nx][ny]!=-1){
				viscow[mapp[nx][ny]] = color;
			}
			vispath[nx][ny] = true;
			q.push(make_pair(nx,ny));
		}
		q.pop();
	}
	color++;
}
int main(){
	memset(mapp,-1,sizeof(mapp));
	cin >> n >> k >> r;
	for(int i=0;i<r;i++){
		int x,y,nx,ny;
		cin >> x >> y >> nx >> ny;
		if(nx-x==1){
			blocked[x][y][0] = true;
			blocked[nx][ny][1] = true;
		}
		if(nx-x==-1){
			blocked[x][y][1] = true;
			blocked[nx][ny][0] = true;
		}
		if(ny-y==1){
			blocked[x][y][2] = true;
			blocked[nx][ny][3] = true;
		}
		if(ny-y==-1){
			blocked[x][y][3] = true;
			blocked[nx][ny][2] = true;
		} 
	}
	for(int i=0;i<k;i++){
		int cowx,cowy;
		cin >> cowx >> cowy;
		cows[i].first = cowx;
		cows[i].second = cowy;
		mapp[cowx][cowy] = i;
	}
	int ans = 0;
	for(int i=0;i<k;i++){
		if(viscow[i]!=color && viscow[i]!=0)continue;
		int tmp = 0;
		memset(vispath,false,sizeof(vispath));
		bfs(i);
	}
	for(int i=0;i<k;i++){
		
		colors[viscow[i]]++;
	}
	for(int i=1;i<color;i++){
		cout << colors[i] << " ";
		for(int j=i+1;j<color;j++){
			ans+=colors[i]*colors[j];
		}
	}
	cout << endl;
	cout << ans << endl;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...