紫书搜索 习题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 }
原文地址:https://www.cnblogs.com/yxg123123/p/6827596.html