洛谷--P2015_k皇后 (java,100)

在这里插入图片描述
如果我们建一个二维数组【n】【m】的话,那么毫无疑问,空间超限,
我原本思路就是这样 。改了好久,空间都过不去,后面放弃了原来的。
换了另一种一维的方法。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int m = input.nextInt();
        int k = input.nextInt();
        int[] map = new int[m + 1];
        //map记录每行的列
        int[] x = new int[k + 1];
        int[] y = new int[k + 1];
        for (int i = 1; i < k + 1; i++) {
            //记录输入坐标,y为纵坐标,x为横坐标
            y[i] = input.nextInt();
            x[i] = input.nextInt();
        }
        Arrays.fill(map, 0);
        //map全部初始化为0;
        int t = 0, sum = 0;
        //t统计每行里面不受攻击的格子数,sum统计总的不受攻击的格子数。
        for (int i = 1; i <= n; i++) {
            t = m;
            //每次循环都重新赋值为列的个数m,每一个格子受到攻击,则t--;
            for (int j = 1; j <= k; j++) {
                if (y[j] == i) {
                    //如果y[j]==i;即当前i行上面有皇后,整一行都被攻击,t=0;
                    t = 0;
                    break;
                }
                if (map[x[j]] != i) {
                    //这里的i和map[x[j]]没有什么特殊的联系,不管是第几行,同列的攻击。
                    // 只是我们把赋值为i后,下面用!=i作为判断,以便下面判断斜线的时候不会重复统计
                    map[x[j]] = i;
                    t--;
                }
                if ((i + x[j] - y[j]) > 0 && (i + x[j] - y[j]) <= m && map[i + x[j] - y[j]] != i) {
                    //判断正斜线(x1-y1)==(x2-y2) --> x2==y2+x1-y1==i + x[j] - y[j];
                    map[i + x[j] - y[j]] = i;
                    t--;
                }
                if ((x[j] + y[j] - i) > 0 && (x[j] + y[j] - i) <= m && map[x[j] + y[j] - i] != i) {
                    //判断反斜线 (x1+y1)=(x2+y2) --> x2==x1+y1-y2==x[j] + y[j] - i;
                    map[x[j] + y[j] - i] = i;
                    t--;
                }
            }
            sum += t;
        }
        System.out.println(sum);
    }
}


在这里插入图片描述
原题链接:https://www.luogu.com.cn/problem/P2105

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值