[洛谷2994]超级弹珠

 

题目描述 Description

    奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩蛋游戏设备。Bessie把她们玩游戏的草坪划成了N*N单位的矩阵,同时列出了她的K个对手在草地上的位置。然后她拿着这张表来找你,希望你能帮她计算一个数据。

   在这个游戏中,奶牛可以用一把弹珠枪向8个方向(正东、正南、正西、正北、正东北、正东南、正西北、正西南)中的任意一个方向发射子弹。Bessie希望你告诉她,如果她想站在一个可以射到所有对手的格子上,那么她有多少种选择。当然,Bessie可以跟某一个对手站在同一个格子上,在这种情况下,Bessie也能射到这个对手。

输入描述 Input Description

第一行:两个用空格隔开的整数:N K

第二至第K+1行:第i+1行有两个以空格隔开的整数R-i和C-i,描述第i头奶牛的位置,表示她站在第R-i行,C-i列。

输出描述 Output Description

仅一行:输出一个整数,表示Bessie可以选择的格子数量。

样例输入 Sample Input

4 3

2 1

2 3

4 1

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

1<=N<=500

1<=K<=100 000

样例说明

Bessie可以选择站在一下格子中的任意一个:(2,1),(2,3),(3,2),(4,4),(4,3).下右图中,Bessie与其他奶牛共同占有的格子被标记为“*”

.   .   .   .                            .   .   .   .

B  .   B  .      =======>    *  .   *  .

.   B   .  .      =======>    .   B  .   .

B  .   B  .                            *  .   B  . 

思路:

  可以用回溯法跑出所有的情况,也可以换种方法把能打的敌人做上标记。反正无论如何爆搜既可以过。

var f:array[1..500,1..500] of longint;
    x1,x2,x,y:array[-500..500] of longint;
    n,k,i,a,b,j:Longint;
    ans:longint=0;

begin
    read(n,k);
    for i:=1 to k do
    begin
        read(a,b);
        inc(x[a]);
        inc(y[b]);
        inc(x1[a+b]);
        inc(x2[a-b]);
        f[a,b]:=1;
    end;
    for i:=1 to n do
        for j:=1 to n do
            begin
                if x[i]+y[j]+x1[i+j]+x2[i-j]-3*f[i,j]=k then inc(ans);
            end;
    writeln(ans);
end.
View Code
原文地址:https://www.cnblogs.com/yangqingli/p/4739349.html