战舰数量

版权声明:

本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处.

上周经历了人生中最艰辛的几天,所以刷题又耽误了3周多,今天重新开刷。又出现恍如隔世的感觉了!

来看看这道题:

Battleships in a Board(419)

一、我的思路:

1.初始化一个二维数组;

2.然后开始找字符x;

3.如果找到x,找它的邻居。

if(up down && no-left no-right) count++;

if(no-up no-down && left right) count++;

于是我按照自己的思路实现了一下程序,其实我知道我的思路是“暴力”的,当然程序跑起来了,但是结果千疮百孔。原因是我太多太多因素没有考虑到,这充分说明我的思路非常不缜密。并且我距离“算法”这两个字,还有好远好远!

但是进步的地方是,我至少有思路了,并且可以尝试写一下,并且跑起来了。

二、答案解析

此题用了一个很不错的技巧,他把战舰理解成蛇的样子,所以只找到top-left,也就是找到所谓蛇头。找到蛇头以后就可以找到蛇的数量了。

public class Battleship1 {

  public static void main(String[] args) {
    char[][] board = new char[][] { { ‘x‘, ‘.‘, ‘.‘, ‘x‘ }, { ‘.‘, ‘.‘, ‘.‘, ‘x‘ },
        { ‘.‘, ‘.‘, ‘.‘, ‘x‘ } };
    System.out.println("Battleship:" + Solution.countBattleships(board));

  }

  public static class Solution {
    public static int countBattleships(char[][] board){
      int count = 0;
      if (board == null || board.length == 0 || board[0].length == 0) {
        return 0;
      }
      for (int i = 0; i < board.length ; i++) {
        for (int j = 0; j < board[0].length; j++) {
           if(board[i][j]==‘.‘)
             continue;
           if(i>0&&board[i-1][j]==‘x‘)
             continue;

           if(j>0&&board[i][j-1]==‘x‘)
             continue;

           count++;
           System.out.println("Battleship:"+count+"i="+i+","+"j="+j+",");
        }

      }
      return count;
    }
  }

}

补充知识点:

continue:

在一个循环内部,如果执行完那个语句之后,continue;就不在执行本次循环内的continue之后的语句了。

三、题目变型

自己写一个简单的battleships,不过这个battleships是线性的,不是平面的。比如:…xxx.

运用上面的思路很快就写出来了。

public class battleShips1 {

  public static void main(String[] args) {
    char[] line={‘.‘,‘x‘,‘.‘,‘x‘,‘.‘,‘.‘,‘x‘,‘x‘};
    System.out.println(Solution.countBattleships(line));

  }

  public static class Solution{
    public static int countBattleships(char[] line){
      int count=0;
      if(line==null||line.length==0){
        return 0;
      }

      for(int i=0;i<line.length;i++){
        if(line[i]==‘.‘){
          continue;
        }
        if(i>0&&line[i-1]==‘x‘){
          continue;
        }
        count++;

      }
      return count;
    }
  }

}

这道题这个算法非常的优秀,但是我短时间是不可能想到了。所以应该再多练习,我练习的题目还是太少太少了。我看了一下,leetcode现在只刷了11道。还差太远了!继续加油努力!不要想太多,学习本身其实也是一种幸福。

时间: 2024-10-21 14:43:19

战舰数量的相关文章

51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释

题目:51nod: 题目Codeforces: 题目注意到两个战舰不能挨在一起就可以了. // 每一段 struct node{ int left; // 段的左端点 int right; // 段的右端点 int length; // 段长度 int ship; // 段最大容纳战舰数 }arr[200005]; 每一段可容纳战舰数: ship*a + (ship - 1) <= length;   -->   ship = (length+1) / (a+1);(舍去小数部分) 构造出这么

CSDN开源夏令营 百度数据可视化实践 ECharts 11 (期末总结)

致谢: CSDN开源夏令营马上就要结束了,随着ECharts专题列入百度ECharts官网,任务就算是基本完成了.再次谢谢林峰老师!回想两个月前听到CSDN要举办这个活动,第一感觉是非常棒,所有就积极看了看所有的项目,项目总体质量很棒,涉及的方面也很广,有云与大数据方面的.有前端与移动方面的.嵌入式与智能硬件方面的.其中linux方面的也很多,总之项目很丰富,也都很有挑战.CSDN是第一年举办这样的活动,虽然时间准备上有些仓促外,总体上组织的很好,在做项目的过程中CSDN的工作人员的服务态度也很

POJ 1988 【并查集 妙用deep数组】

Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There

洛谷 P1196 [NOI2002]银河英雄传说

有很多人都把这道题讲得很详细了,我就不再重复了. 要总结的是,这可以看作一种"边带权"的并查集,对于这种并查集我们可以另开数组记录边上的关系,然后在find和unite的同时对关系进行维护. 于是此题中我们用一个 d 数组来记录当前战舰 到 这列战舰最前面的战舰 的战舰数量, 用一个 size 数组(在程序中为了避免关键字换成了siz)记录当前战舰后面跟了多少战舰(为了方便M操作时更新d). 具体的维护方式参考代码. 1 #include <bits/stdc++.h> 2

tyvj1938 最优战舰

描述 太空战队顺利地完成了它的第一次使命,这一行动的受益者陆军本部当即决定,请陆军的战士们投票选出最优战舰并报司令总部进行表彰.为防止有人利用高科技手段造假,陆军本部决定使用最原始的方法进行投票.可不幸的是,陆军的战士正在N个不同的地点执行任务,第i个地点有a[i]名战士参加投票.按照规定,票箱的数量是有限的M(M>=N)个,每个票箱的容量必须完全相同.显然,分配给每个选区的票箱总容量不能比选区的战士数目少.不幸中的万幸,票箱的容量C是可以任意规定的.陆军本部需要你的帮助来合理地把这M个票箱分给

51Nod - 1521 一维战舰

51Nod - 1521 一维战舰 爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a 的长方形(也就是说,战舰会占据a个连续的方格).这些战舰不能相互重叠,也不能相接触. 然后鲍博会做一系列的点名.当他点到某个格子的时候,爱丽丝会告诉他那个格子是否被某只战舰占据.如果是,就说hit,否则就说miss. 但是这儿有一个问题!爱丽丝喜欢撒谎.他每次都会告诉

银河战舰

[问题描述]    瑞奥和玛德利德是非常好的朋友.瑞奥平时的爱好是吹牛,玛德利德的爱好是戳穿瑞奥吹的牛.    这天瑞奥和玛德利德来到了宇宙空间站,瑞奥向玛德利德炫耀这个空间站里所有的银河战舰都是自己的.整个空间站可以看成一个无限大的二维平面,而每个战舰都可以看做一个点,在空间站中一共分布着N艘银河战舰.    玛德利德:"你说这些都是你的,那你让他们动一动啊"瑞奥:"诶你看,那艘动了!"    玛德利德:"操作指令由我来发,一共有5种动的方法--&quo

C#:多进程开发,控制进程数量

正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下: System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew( (object mystate) => { Process process = Process.Start("AutoCollectMrMultipleProcess.exe", mystate.ToString()); process.WaitF

1003 阶乘后面0的数量

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1其实只要循环除五就可以找到规律,其实也可以证明出来. 1 #include <iostream> 2 #include <cstdio> 3 #