• UVA 11214 Guarding the Chessboard


    题意:

      皇后防御的范围是他所在横、竖、对角线,地图上的#为可以放旗子的地方。问最少放几个皇后能防守所有#。

    分析:

      vis数组开4维,对应行、列、主对角线、副对角线

    代码:

      

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int map[15][15];
    int vis[4][30];
    int n,m;
    int maxn;
    int kase;
    int same()//判断是否能防守所有#
    {
    int i,j,k;
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
    if(map[i][j]&&!vis[0][i]&&!vis[1][j]&&!vis[2][i+j]&&!vis[3][n+j-i])
    return 0;
    return 1;
    }
    int dfs(int d,int cur,int l)//d代表放第几个皇后,cur代表皇后放在那,cur/m为横坐标,cur%m为纵坐标,l代表总共有几个皇后。
    {
    int i,j,k;
    if(d==l)
    {
    if(same())
    {
    printf("Case %d: %d ",++kase,d);
    return 1;
    }
    return 0;
    }
    else
    {
    for(i=cur;i<n*m;i++)
    {
    int x=i/m,y=i%m;
    int tmp1=vis[0][x],tmp2=vis[1][y],tmp3=vis[2][x+y],tmp4=vis[3][n-x+y];
    vis[0][x]=vis[1][y]=vis[2][x+y]=vis[3][n-x+y]=1;
    if(dfs(d+1,i,l))
    return 1;
    vis[0][x]=tmp1,vis[1][y]=tmp2,vis[2][x+y]=tmp3,vis[3][n-x+y]=tmp4;
    }
    }
    return 0;
    }
    int main()
    {
    kase=0;
    while(scanf("%d",&n),n)
    {
    scanf("%d",&m);
    int i,j;

    memset(vis,0,sizeof(vis));
    memset(map,0,sizeof(map));
    string s;
    for(i=0;i<n;i++)
    {
    cin>>s;
    for(j=0;j<m;j++)
    {
    if(s[j]=='X')
    map[i][j]=1;
    }
    }
    for(maxn=0;;maxn++)
    {
    memset(vis,0,sizeof(vis));
    if(dfs(0,0,maxn))
    {
    break;
    }
    }
    }
    }
  • 相关阅读:
    『软件介绍』SQLServer2008 基本操作
    PCA的数学原理
    PCA的数学原理
    Oracle数据处理
    UVa 11995
    Unreal Engine 4 C++ 为编辑器中Actor创建自己定义图标
    codecombat之边远地区的森林1-11关及地牢38关代码分享
    初识ecside
    how tomcat works读书笔记 七 日志记录器
    HDU 1754(线段树区间最值)
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4855840.html
Copyright © 2020-2023  润新知