P7059 [NWRRC2015]Lucky Chances题解

· · 题解

Updata 再次阅读完题解攻略后对题解进行格式和代码注释的修改

一个名为幸运的机会的游戏,根据图片的提示,我们选择模拟。模拟大法好

这篇题解主要讲一下这道题的细节。

  1. 扫描某个方向是全是严格小于选择方块的数,等于的不算

  2. 不是方块所在的横或者列。

  3. 可以选择方格某一方向(当然不包括此方格)逐个枚举,若有一个方块 \geq 当前选择方块则此方向 pass

  4. 关于边界的处理,其实此题可以不做过多处理。

ACCode:

#include<bits/stdc++.h>

using namespace std;

int n,m;
int Map[1100][1100];
//建议大家不要同“Map”这样设置变量名,容易让人产生歧义而想起STL中的map;希望大家可以避免错误。
int ans=0;//ans存储答案

int main() {

    cin>>n>>m;

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            cin>>Map[i][j];
        }
    }

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            bool k=false;
            for(int l=i-1; l>=1; l--) {
                if(Map[l][j]>=Map[i][j]) {
                    k=true;
                    break;
                }
            }
            if(k==false) {
                ans++;//某一方向达成条件
            } else {
                k=false;
            }

            for(int l=j-1; l>=1; l--) {
                if(Map[i][l]>=Map[i][j]) {
                    k=true;
                    break;
                }
            }
            if(k==false) {
                ans++;
            } else {
                k=false;
            }

            for(int l=i+1; l<=n; l++) {
                if(Map[l][j]>=Map[i][j]) {
                    k=true;
                    break;
                }
            }
            if(k==false) {
                ans++;
            } else {
                k=false;
            }

            for(int l=j+1; l<=m; l++) {
                if(Map[i][l]>=Map[i][j]) {
                    k=true;
                    break;
                }
            }
            if(k==false) {
                ans++;
            } else {
                k=false;
            }

        }
    }

    printf("%d\n",ans);

    return 0;
}

qwq蒟蒻第一次独立发题解祭祀