[Daily] 20200523

C题.[Codeforces 330C] Purification

题目链接

思路: 看这个样例

5
EE.EE
E.EE.
E…E
.EE.E
EE.EE

不难看出如果有解,要么每行都有一个点(随意哪个列上的点都行),要么每列都有一个点,否则无解。所以判断并任意输出一种方案或无解。

//AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=107;
char a[N][N];
int n,row[N],column[N],fr[N],fc[N],cnt,ans[N*N][2];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		if(a[i][j]=='.')row[i]=j,column[j]=i;
	int flag=1;
	for(int i=1;i<=n;i++)if(row[i]==0)flag=0;
	if(flag){
		for(int i=1;i<=n;i++)cout<<i<<" "<<row[i]<<"\n";
		return 0;
	}
	flag=1;
	for(int i=1;i<=n;i++)if(column[i]==0)flag=0;
	if(flag){
		for(int i=1;i<=n;i++)cout<<column[i]<<" "<<i<<"\n";
		return 0;
	}
	cout<<-1;
}

D题.[codeforces 330D] Biridian Forest

题目链接

思路: 如果位置(x,y)上为0—9,即breeders, 当且仅当 [它到出口E的最短距离]<=[你的初始位置S到出口E的最短距离] 时,它能且一定能与你发生冲突。因为它根本不需要走到你的路径上,它只需要跟你同时走到终点,或者比你早到终点等着你,你就会碰到它并决斗。
所以从终点开始bfs,求出终点到所有点的最短距离。然后遍历一遍整个矩阵,如果位置(x,y)上为0—9,并且 [它到出口E的最短距离]<=[你的初始位置S到出口E的最短距离] ,答案就累加上这个位置的breeders数量。

//AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1007;
char a[N][N];
int n,m,dis[N][N],sx,sy,tx,ty,ans;
const int x_[4]={1,-1,0,0};
const int y_[4]={0,0,1,-1};
struct node{
	int x,y,d;
};
queue<node>q;
void bfs(int tx,int ty){
	q.push(node{tx,ty,0});
	dis[tx][ty]=-1;
	int x,y;
	while(!q.empty()){
		node now=q.front();q.pop();
		for(int i=0;i<4;i++){
			x=now.x+x_[i];
			y=now.y+y_[i];
			if(x<1||y<1||x>n||y>m||dis[x][y]!=0||a[x][y]=='T')continue;
			q.push(node{x,y,now.d+1});
			dis[x][y]=now.d+1;
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		if(a[i][j]=='S'){sx=i;sy=j;}
		if(a[i][j]=='E'){tx=i;ty=j;}
	}
	bfs(tx,ty);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		if(dis[i][j]!=0&&dis[i][j]<=dis[sx][sy]&&a[i][j]>='0'&&a[i][j]<='9')ans+=a[i][j]-'0';
	cout<<ans;

猜你喜欢

转载自blog.csdn.net/qq_45530271/article/details/106305608