zoukankan      html  css  js  c++  java
  • 紫书搜索 习题7-10 UVA

    题目链接:

    https://vjudge.net/problem/UVA-11214

    题意:

    给出m*n棋盘上的目标点,求最少用几个皇后可以守卫所有目标点。

    题解:

    类似八皇后做法,2维数组标记行、列、主对角线、副对角线。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 int n,m,maxd;
    19 int tag[15][15];
    20 int vis[4][30];
    21 
    22 bool ok(){
    23     for(int i=0; i<n; i++)
    24         for(int j=0; j<m; j++){
    25             if(tag[i][j] && !vis[0][i] && !vis[1][j] && !vis[2][i+j] && !vis[3][i-j+n])
    26                 return false;
    27         }
    28     return true;
    29 }
    30 
    31 bool dfs(int d,int cur){
    32     if(d == maxd){
    33         if(ok()) return true;
    34         return false;
    35     }
    36 
    37     for(int pos=cur; pos<n*m; pos++){
    38         int r = pos/m, c = pos%m;
    39         int t1 = vis[0][r], t2 = vis[1][c], t3 = vis[2][r+c], t4 = vis[3][r-c+n];
    40         vis[0][r] = vis[1][c] = vis[2][r+c] = vis[3][r-c+n] = 1;
    41         if(dfs(d+1,pos+1)) return true;
    42         vis[0][r]=t1, vis[1][c]=t2, vis[2][r+c]=t3, vis[3][r-c+n]=t4;
    43     }
    44     return false;
    45 }
    46 
    47 int main(){
    48     int cas = 0;
    49     while(scanf("%d",&n) && n){
    50         scanf("%d",&m);
    51         MS(tag); MS(vis);
    52         char c;
    53         for(int i=0; i<n; i++)
    54             for(int j=0; j<m; j++){
    55                 scanf(" %c",&   c);
    56                 if(c == 'X'){
    57                     tag[i][j] = 1;
    58                 }
    59             }
    60 
    61         for(maxd=1; ; maxd++){
    62             if(dfs(0,0)){
    63                 printf("Case %d: %d
    ",++cas,maxd);
    64                 break;
    65             }
    66         }
    67     }
    68 
    69     return 0;
    70 }
  • 相关阅读:
    【PS】Colorful and flowing word tutorials 彩色流光字教程
    【Language】Popular Javascript Convention on Github
    java 题目
    swift 构造过程
    swift 继承相关
    swift 方法功能
    javascript闭包
    IOS swift学习地址
    guava 工具包
    数字和大写字母字符串
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827596.html
Copyright © 2011-2022 走看看