练习题(1)

3 篇文章 0 订阅

题目

topcoder Room 675 SRM 477 DIV1 

一道比较简单的题目

将6棱形的每条边,遍历一下就行了,注意奇数行和偶数行是不同点。

红色的是陆地,蓝色的是海洋,计算海滩的长度,其实就是海洋和陆地相邻的总长度

'#'号表示陆地,'.'表示海洋

Definition

 
Class:Islands
Method:beachLength
Parameters:vector <string>
Returns:int
Method signature:int beachLength(vector <string> kingdom)
(be sure your method is public)

1) 
 
{"..#.##", 
 ".##.#.", 
 "#.#..."}
Returns: 19
The example in the problem statement.
2) 
 
{"#...#.....",
 "##..#...#."}
Returns: 15
3) 
 
{"....#.",
 ".#....",
 "..#..#",
 "####.."}
Returns: 24



#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Islands{
	public:
		int beachLength(vector <string> kingdom){
			int res=0;
			int M = kingdom.size();
			int N = kingdom[0].size();
			for(int i=0;i<M;i++){
				for(int j=0;j<N;j++){

					if(kingdom[i][j]=='#'){
						if(j-1>=0 && kingdom[i][j-1]=='.'){
							res++;
						}	
						if(j+1<N && kingdom[i][j+1]=='.'){
							res++;
						}
						if(i%2==0){
							if(i-1>=0 && j-1>=0 && kingdom[i-1][j-1]=='.'){
								res++;
							}
							if(i-1>=0 && kingdom[i-1][j]=='.'){
								res++;
							}
							if(i+1<M && j-1>=0 && kingdom[i+1][j-1]=='.'){
								res++;
							}
							if(i+1<M && kingdom[i+1][j]=='.'){
								res++;
							}
						}else{
							if(i-1>=0 && j+1<N && kingdom[i-1][j+1]=='.'){
								res++;
							}
							if(i-1>=0 && kingdom[i-1][j]=='.'){
								res++;
							}
							if(i+1<M && j+1<N && kingdom[i+1][j+1]=='.'){
								res++;
							}
							if(i+1<M && kingdom[i+1][j]=='.'){
								res++;
							}							

						}	
						cout<<"position"<<" "<<i<<" "<<j<<" result:"<<res<<endl;
					}
				}
			}	

			return res;
		}
};
int main(){
	Islands m = Islands();
	vector<string> v;
	v.push_back("..#.##");
	v.push_back(".##.#.");
	v.push_back("#.#...");
	int res= m.beachLength(v);
	cout<<res<<endl;
	return 0;

}

判断是否是是海滩的整个判断逻辑是可以抽出来的,单独用一个函数的,这个逻辑会更加简单。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值