紫书搜索 习题7-10 UVA

来源:互联网 发布:佳明软件下载 编辑:程序博客网 时间:2024/04/18 16:13

题目链接:

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

题意:

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

题解:

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

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e5+10;int n,m,maxd;int tag[15][15];int vis[4][30];bool ok(){    for(int i=0; i<n; i++)        for(int j=0; j<m; j++){            if(tag[i][j] && !vis[0][i] && !vis[1][j] && !vis[2][i+j] && !vis[3][i-j+n])                return false;        }    return true;}bool dfs(int d,int cur){    if(d == maxd){        if(ok()) return true;        return false;    }    for(int pos=cur; pos<n*m; pos++){        int r = pos/m, c = pos%m;        int t1 = vis[0][r], t2 = vis[1][c], t3 = vis[2][r+c], t4 = vis[3][r-c+n];        vis[0][r] = vis[1][c] = vis[2][r+c] = vis[3][r-c+n] = 1;        if(dfs(d+1,pos+1)) return true;        vis[0][r]=t1, vis[1][c]=t2, vis[2][r+c]=t3, vis[3][r-c+n]=t4;    }    return false;}int main(){    int cas = 0;    while(scanf("%d",&n) && n){        scanf("%d",&m);        MS(tag); MS(vis);        char c;        for(int i=0; i<n; i++)            for(int j=0; j<m; j++){                scanf(" %c",&   c);                if(c == 'X'){                    tag[i][j] = 1;                }            }        for(maxd=1; ; maxd++){            if(dfs(0,0)){                printf("Case %d: %d\n",++cas,maxd);                break;            }        }    }    return 0;}
0 0