ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

水流

2019-04-15 13:39:56  阅读:254  来源: 互联网

标签:格子 int 样例 55 && include 水流


题目描述

全球气候变暖,小镇A面临水灾。于是你必须买一些泵把水抽走。泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里。小镇可以认为是N×M的矩阵。矩阵里的每个单元格都是一个“a”-“z”小写字母,该小写字母表示该格子的高度,字母大的表示该单元格比较高,反之,表示该格子高度比较低。当前单元格的水可以流到上、下、左、右四个格子,但必须满足这些格子的高度是小于或者等于当前格子的高度。现在,给你一些N×M的矩阵,你至少要买多少个泵,才能把所有格子的水都能被抽走?

输入输出格式

输入格式:

多组测试数据。

第一行,一个整数K,表示有K组测试数据。1≤K≤5;

接下来有K组测试数据,每组测试数据格式如下:

第一行,两个正数,N,M。1≤N,M≤50,表示小镇的大小;

接下来有N行,每行有M个小写字母,表示小镇的地图。

输出格式:

共K行,每行对应一组数据。至少要买多少个泵,才能把所有格子的水都能抽走。

输入输出样例

输入样例一:
2 
5 5 
ccccc
cbbbc
cbabc
cbbbc
ccccc
4 9 
cbabcbabc
cbabcbabc
cbabcbabc
cbabcbabc
输出样例一:
1
2
输入样例二:
1
11 11
ccccccccccc
caaaaaaaaac
caaaaaaaaac
caazpppzaac
caapdddpaac
caapdddpaac
caapdddpaac
caazpppzaac
caaaaaaaaac
caaaaaaaaac
ccccccccccc
输出样例二:
2

思路:每轮找最低处,进行抽水.
代码:
//程序名:新的C++程序
//作者: 

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>

using namespace std;
int n,a,b,e[55][55],g[55][55],smallx,smally,ans;
char f;
void scanf()
{
	memset(e,0,sizeof(e));
	cin>>a>>b;
	for(int j=1;j<=a*b;j++)
	{
		cin>>f;	
		e[(j-1)/b+1][(j-1)%b+1]=f-96;
	}
}
void getsmall()
{
	int minn=27;
	smallx=0;smally=0;
	for(int i=1;i<=a;i++)
	{
		for(int j=1;j<=b;j++)if(e[i][j]<minn&&e[i][j]!=0)minn=e[i][j],smallx=i,smally=j;
	}
}
void dfs(int w,int x)
{
	if(e[w-1][x]>=e[w][x]&&w-1>0&&!g[w-1][x]){g[w-1][x]=1;dfs(w-1,x);}
	if(e[w][x-1]>=e[w][x]&&x-1>0&&!g[w][x-1]){g[w][x-1]=1;dfs(w,x-1);}
	if(e[w+1][x]>=e[w][x]&&w+1<=a&&!g[w+1][x]){g[w+1][x]=1;dfs(w+1,x);}
	if(e[w][x+1]>=e[w][x]&&x+1<=b&&!g[w][x+1]){g[w][x+1]=1;dfs(w,x+1);}
	return;
}
void water()
{
	for(int i=1;i<=a;i++)
		for(int j=1;j<=b;j++)if(g[i][j]==1)e[i][j]=0;
	memset(g,0,sizeof(g));
}
bool check()
{
	for(int i=1;i<=a;i++)
		for(int j=1;j<=b;j++)if(e[i][j]!=0)return true;
	return false;
}
void printf1()
{
	cout<<"e:"<<endl;
	for(int i=1;i<=a;i++)
	{
		for(int j=1;j<=b;j++)cout<<e[i][j]<<" ";cout<<endl;
	}
	cout<<endl;
}
void printf2()
{
	cout<<"g:"<<endl;
	for(int i=1;i<=a;i++)
	{
		for(int j=1;j<=b;j++)cout<<g[i][j]<<" ";cout<<endl;
	}
	cout<<endl;
}
int main()
{
    cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf();
		ans=0;
		while(check())
		{
			//printf1();
			getsmall();
			//cout<<smallx<<" "<<smally<<endl;	
			g[smallx][smally]=1;			
			dfs(smallx,smally);
			water();
			//printf2();
			//printf1();
			ans++;
		}
		cout<<ans<<endl;
	}
	

    return 0;
}
 

标签:格子,int,样例,55,&&,include,水流
来源: https://www.cnblogs.com/2006hanziwei/p/10710179.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有