zoukankan      html  css  js  c++  java
  • P1219 [USACO1.5]八皇后 Checker Challenge

    经典八皇后,需要用一些标记数组优化对角线、横线

    以n=6为例,主对角线(黑)和副对角线(红)各有11(2n-1)条,需要判断一个点((x,y))所在的对角线

    公式:(idx_{red} = y + x - 1, idx_{black}= y-x+n)

    #include<iostream>
    using namespace std;
    
    const int N = 20;
    
    int pos[N];
    int cnt;
    int dg1[2 * N - 1];
    int dg2[2 * N - 1];
    int l[N];
    
    int n;
    
    int check(int x, int y){
        if(l[x]) return 0;
        if(dg1[y - x + n] || dg2[y + x - 1]) return 0;
        return 1;
    }
    
    void dfs(int u){
        if(u == n + 1){
            if(cnt ++ < 3){
                for(int i = 1; i <= n; i ++) cout << pos[i] << ' ';
                cout << endl;
            }
            return;
        }
        
        for(int i = 1; i <= n; i ++){
            if(check(i, u)){
                dg1[u - i + n] ++;
                dg2[u + i - 1] ++;
                pos[u] = i;
                l[i] ++;
                dfs(u + 1);
                dg1[u - i + n] --;
                dg2[u + i - 1] --;
                pos[u] = 0;
                l[i] --;
            }
        }
    }
    
    int main(){
        cin >> n;
        
        dfs(1);
        cout << cnt << endl;
        
        return 0;
    }
    
  • 相关阅读:
    Lambda
    Thread&线程池
    异常
    Map
    List and Set
    Collection和迭代器Iterator
    Object类,常用API
    (一)自定义 mybatis 之框架介绍
    Nginx三大功能及高并发分流
    http协议改为https
  • 原文地址:https://www.cnblogs.com/tomori/p/15342480.html
Copyright © 2011-2022 走看看