首页 > 其他分享 >1.17 刷题

1.17 刷题

时间:2025-01-17 18:03:30浏览次数:1  
标签:1.17 int static && d4 d2 d3 刷题

1 思路

P1331 海战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 本题难点主要是如何分辨哪些穿是相撞而产生无效,哪些是有效
  • 很容易想到的是,不论是bfs还是dfs都可以轻松全部搜掉,只需要简单的遍历所有点,然后套板子即可
  • 但是这是无法排除无效情况的,也就是相撞的情况
  • 推敲一下,发现其实就只有4种情况会无效

  • 那么只要写个判断函数就可以排除这四种情况
  • 即只需要dfs搜索+判断即可解决这道题

2 代码

#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;

const int N = 1e3 + 10;
int m[N][N];
bool str[N][N];
int r, c, ans;
int dx[] = {0, 1, 1};
int dy[] = {1, 0, 1};

int Judge(int x, int y) {
    int d1 = m[x][y];
    int d2 = m[x + 1][y];
    int d3 = m[x][y + 1];
    int d4 = m[x + 1][y + 1];
    // for(int i = 0; i < 2; i++) {
    //    for(int j = 0; j < 2; j++) {
    //       int nowx = x + dx[i];
    //       int nowy = y + dy[i];
    //       if(nowx <= c && nowy <= r) {
    //          if(m[nowx][nowy] == 1) {
    //             str[nowx][nowy] = 1;
    //          } else {
    //             return -1;
    //          }
    //       }
    //    }
    // }
    if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 0) return -1;
    if(d1 == 1 && d4 == 1 && d3 == 1 && d2 == 0) return -1;
    if(d1 == 1 && d2 == 1 && d4 == 1 && d3 == 0) return -1;
    if(d4 == 1 && d2 == 1 && d3 == 1 && d1 == 0) return -1;
    return 1;
}

int po() {
    for(int i = 1; i <= r; i++) {
       for(int j = 1; j <= c; j++) {
          int pan = Judge(i,j);
          if(pan == -1) {
             cout<<"Bad placement."<<endl;
             return -1;
          }
       }
    }
    return 0;
}

void dfs(int x, int y) {
    for(int i = 0; i < 3; i++) {
       int nowx = x + dx[i];
       int nowy = y + dy[i];
       if(m[nowx][nowy] == 1 && str[nowx][nowy] == false) {
          str[nowx][nowy] = true;

          dfs(nowx, nowy);
       }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    memset(m, 0, sizeof(m));
    memset(str, false, sizeof(str));


    cin>>r>>c;

    for(int i = 1;i <= r; i++) {
       for(int j = 1;j <= c; j++) {
          char s;
          cin>>s;
          if(s == '#') {
             m[i][j] = 1;
          }
       }
    }

    int k = po();
    if(k == -1) return 0;

    memset(str, false, sizeof(str));
    for(int i = 1;i <= r; i++) {
       for(int j = 1;j <= c; j++) {
          if(m[i][j] == 1 && str[i][j] == false) {
             str[i][j] = true;
             dfs(i, j);
             ans++;
          }
       }
    }

    cout<<"There are "<<ans<<" ships.";

    return 0;

}
import java.util.Scanner;

public class Main {
    static final int N = 1010;
    static int[][] m = new int[N][N];
    static boolean[][] str = new boolean[N][N];
    static int r, c, ans;
    static int[] dx = {0, 1, 1};
    static int[] dy = {1, 0, 1};

    public static int Judge(int x, int y) {
        int d1 = m[x][y];
        int d2 = m[x + 1][y];
        int d3 = m[x][y + 1];
        int d4 = m[x + 1][y + 1];

        if(d1 == 1 && d2 == 1 && d3 == 1 && d4 == 0) return -1;
        if(d1 == 1 && d4 == 1 && d3 == 1 && d2 == 0) return -1;
        if(d1 == 1 && d2 == 1 && d4 == 1 && d3 == 0) return -1;
        if(d4 == 1 && d2 == 1 && d3 == 1 && d1 == 0) return -1;
        return 1;
    }

    public static int po() {
        for(int i = 1; i <= r; i++) {
            for(int j = 1; j <= c; j++) {
                int pan = Judge(i,j);
                if(pan == -1) {
                    System.out.println("Bad placement.");
                    return -1;
                }
            }
        }
        return 0;
    }

    public static void dfs(int x, int y) {
        for(int i = 0; i < 3; i++) {
            int nowx = x + dx[i];
            int nowy = y + dy[i];
            if(m[nowx][nowy] == 1 && str[nowx][nowy] == false) {
                str[nowx][nowy] = true;

                dfs(nowx, nowy);
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);


        r = scanner.nextInt();
        c = scanner.nextInt();

        for(int i = 1;i <= r; i++) {
            String s1 = scanner.next();
            for(int j = 1;j <= c; j++) {
                char s;
                s = s1.charAt(j - 1);
                if(s == '#') {
                    m[i][j] = 1;
                }
            }
        }

        int k = po();
        if(k == -1) return;

        for(int i = 1;i <= r; i++) {
            for(int j = 1;j <= c; j++) {
                if(m[i][j] == 1 && str[i][j] == false) {
                    str[i][j] = true;
                    dfs(i, j);
                    ans++;
                }
            }
        }


        System.out.println("There are " + ans + " ships.");
        return;
    }

}

标签:1.17,int,static,&&,d4,d2,d3,刷题
From: https://www.cnblogs.com/Mikkeykarl/p/18677459

相关文章

  • 【代码随想录】刷题记录(105)-打家劫舍
    题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况......
  • 【代码随想录】刷题记录(103)-整数拆分
    题目描述:给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k>=2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。 示例1:输入:n=2输出:1解释:2=1+1,1×1=1。示例 2:输入:n=10输出:36解释:10=3+3+4,3× 3× 4=......
  • 【hot100】刷题记录(1)-移动零
    题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0] 提示:1<=nu......
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • C语言二级刷题---程序设计01
     请编写一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):程序运行后,如果输入精度0.0005,则程序输出为3.140578。#include<stdio.h>#include<math.h>doublefun(doubleeps){}main(){doublex;voidNONO();......
  • 构造刷题记录
    [AGC001D]ArraysandPalindrome首先观察发现奇数的个数看起来很重要,然后手玩一会发现最多只能有两个奇数,然后再分讨构造就可以了。[AT_hitachi2020_c]ThREE观察到\(3\mida\timesb\)要求\(a,b\)中至少一个3的倍数。发现如果两个点的距离为3的话他们的深度的奇......
  • 【LeetCode 刷题】数组-模拟-螺旋矩阵
    此博客为《代码随想录》数组章节的学习笔记,主要内容为数组模拟的相关题目解析。文章目录59.螺旋矩阵II54.螺旋矩阵59.螺旋矩阵II题目链接classSolution:defgenerateMatrix(self,n:int)->List[List[int]]:l,r,t,b=0,n-1,0,n-......
  • 【LeetCode 刷题】数组-滑动窗口
    此博客为《代码随想录》数组章节的学习笔记,主要内容为滑动窗口知识点的相关题目解析。文章目录209.长度最小的子数组904.水果成篮76.最小覆盖子串209.长度最小的子数组题目链接classSolution:defminSubArrayLen(self,target:int,nums:List[int])->......
  • 【LeetCode 刷题】二分搜索
    此博客作为《代码随想录》的学习笔记,主要内容为二分搜索法及相关题目解析。文章目录704.二分查找35.搜索插入位置34.在排序数组中查找元素的第一个和最后一个位置69.x的平方根367.有效的完全平方数以下所有二分法算法均基于左闭右闭区间704.二分查找LeetCode......
  • 【代码随想录】刷题记录(102)-不同路径 II
    题目描述:给定一个 mxn 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m-1][n-1])。机器人每次只能向下或者向右移动一步。网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有......