列表

详情


NC51273. 車的放置

描述

给定一个N行M列的棋盘,已知某些格子禁止放置。

问棋盘上最多能放多少个不能互相攻击的車。

車放在格子里,攻击范围与中国象棋的“車”一致。

输入描述

第一行包含三个整数N,M,T,其中T表示禁止放置的格子的数量。
接下来T行每行包含两个整数x和y,表示位于第x行第y列的格子禁止放置,行列数从1开始。

输出描述

输出一个整数,表示结果。

示例1

输入:

8 8 0

输出:

8

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 11ms, 内存消耗: 444K, 提交时间: 2020-07-18 08:43:26

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, m, t, ans, fa[205];
bool a[205][205], v[205];

bool dfs(int x) {
	for (int y = 1; y <= m; y++) {
		if (v[y] || a[x][y]) continue;
		v[y] = 1;
		if (fa[y] == 0 || dfs(fa[y])) {
			fa[y] = x;
			return true;
		}
	}
	return false;
}

int main() {
	cin >> n >> m >> t;
	for (int i = 1; i <= t; i++) {
		int x, y; cin >> x >> y;
		a[x][y] = 1;
	}
	for (int i = 1; i <= n; i++) {
		memset(v, 0, sizeof(v));
		if (dfs(i)) ans++;
	}
	cout << ans << endl;
}

C++ 解法, 执行用时: 16ms, 内存消耗: 524K, 提交时间: 2022-04-11 16:09:10

#include<bits/stdc++.h>
using namespace std;
int mp[205][205],vis[205],fa[205],n,m,t,a,b,ans;
bool dfs(int x){
	for(int y=1;y<=m;y++){
		if(vis[y]||mp[x][y])continue;
		vis[y]=1;
		if(!fa[y]||dfs(fa[y])){fa[y]=x;return 1;}
	}
	return 0;
}
int main(){
	cin>>n>>m>>t;
	while(t--)cin>>a>>b,mp[a][b]=1;
	for(int x=1;x<=n;x++){
		memset(vis,0,sizeof vis);
		if(dfs(x))ans++;
	}
	cout<<ans;
	return 0;
}

上一题