练习题(1)

题目

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

练习题(1)_第1张图片


#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;

}

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



你可能感兴趣的:(算法)