Giải bài ntucoder BACO2 - Bàn cờ 2

Thảo luận trong 'Khác' bắt đầu bởi nguyen minh duc, 27 Tháng bảy 2023.

  1. nguyen minh duc

    Bài viết:
    28
    Link bài:

    Thuật toán:


    • Dùng một mảng 2 chiều để đánh dấu các ô trên bàn cờ.
    • Với mỗi quân cờ, ta bắt đầu lan ra theo các hướng đi hợp lệ của nó.

    Code:

    Mã:
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define ii pair <int, int>
    #define rep(k, n) for (int i = k; i <= n; i++)
    using namespace std;
    
    int x, t, ans, position_x, position_y;
    int bc[107][107];
    stack <ii> t_stack, x_stack;
    
    
    void runfor(int runfor_x, int runfor_y, int valuefor_x, int valuefor_y){
        int a = runfor_x; int b = runfor_y;
        while (a <= 8 && b <= 8 && a > 0 && b > 0){
            if (bc[a] == -1) break;
            if (bc[a] == 0){
                bc[a] = 1;
                ans++;
            }
            a += valuefor_x;
            b += valuefor_y;
        }
    }
    
    void read(){
        ios_base::sync_with_stdio(0);
        cin.tie(0); cout.tie(0);
        //freopen("BACO2.INP", "r", stdin);
        //freopen("BACO2.OUT", "w", stdout);
        cin >> t >> x;
        rep(1, t){
            cin >> position_x >> position_y;
            bc[position_x][position_y] = -1;
            t_stack.push(ii(position_x, position_y));
        }
        rep(1, x){
            cin >> position_x >> position_y;
            bc[position_x][position_y] = -1;
            x_stack.push(ii(position_x, position_y));
        }
    }
    
    void run(){
        while (t_stack.size()){
            ans++;
            runfor(t_stack.top().fi+1, t_stack.top().se+1, 1, 1);
            runfor(t_stack.top().fi+1, t_stack.top().se-1, 1, -1);
            runfor(t_stack.top().fi-1, t_stack.top().se+1, -1, 1);
            runfor(t_stack.top().fi-1, t_stack.top().se-1, -1, -1);
            t_stack.pop();
        }
        while (x_stack.size()){
            ans++;
            runfor(x_stack.top().fi+1, x_stack.top().se, 1, 0);
            runfor(x_stack.top().fi-1, x_stack.top().se, -1, 0);
            runfor(x_stack.top().fi, x_stack.top().se+1, 0, 1);
            runfor(x_stack.top().fi, x_stack.top().se-1, 0, -1);
            x_stack.pop();
        }
    
        cout << ans;
    }
    
    int main(){
        read();
        run();
    
        return 0;
    }
     
    Sữa chua việt quất thích bài này.
  2. Đăng ký Binance
Trả lời qua Facebook
Đang tải...