NYOJ587blockhouses

来源:互联网 发布:手机淘宝怎么查号 编辑:程序博客网 时间:2024/05/21 09:37

题目大意:

题目大意,在一块方形的阵地上,有墙和空地,墙上不能放置炮弹,但是炮弹也炸不开墙,每一枚炮弹可以向东南西北四个方向发射弹药,但是遇到墙就会被挡住。现在要求你在这块阵地上尽可能多的布置炮弹,每两枚炮弹之间不得互相攻击。

解题思路:

仔细观察的话这题其实是八皇后问题的一个变种,而且数据范围也小,直接暴力搜索就过了。但是过了之后看有0秒的,然后弱弱的膜拜了一下大神的代码,总结了一点。不带剪枝的搜索都是瞎扯,等于白做啊。

自己写的代码:(40ms)

#include<stdio.h>int Map[5][5];int n;int ans;int Max(int a,int b){   return a>b?a:b;}bool check(int row,int col){    int i=row+1;    while(i<n){        if(Map[i][col]==1)            return false;        if(Map[i][col]==2)            break;        ++i;    }    i=row-1;    while(i>=0){        if(Map[i][col]==1)            return false;        if(Map[i][col]==2)            break;        --i;    }    i=col+1;    while(i<n){        if(Map[row][i]==1)            return false;        if(Map[row][i]==2)            break;            ++i;    }    i=col-1;     while(i>=0){        if(Map[row][i]==1)            return false;        if(Map[row][i]==2)            break;            --i;    }    return true;}void dfs(int row,int col,int num){    int i,j;        ans=Max(ans,num);        for(i=0;i<n;i++)            for(j=0;j<n;j++)                if(!Map[i][j])                    if(check(i,j)){                        Map[i][j]=1;                        dfs(i+1,j+1,num+1);                        Map[i][j]=0;                    }   }int main(){int i,j;char temp;while(scanf("%d",&n)&&n){   ans=0;   getchar();   for(i=0;i<n;i++){        for(j=0;j<n;j++){            scanf("%c",&temp);            if(temp=='X'){                Map[i][j]=2;            }else{               Map[i][j]=0;            }        }        getchar();   }   dfs(0,0,0);   printf("%d\n",ans);   }}

大神的代码:(0ms)这就是差距啊!!!!

#include <stdio.h>#include <string.h>char map[5][5];int n, ans;bool check(int x, int y){if (map[y][x] == 'X')return false;for (int i=x; i>0; --i){if (map[y][i] == 1)return false;else if (map[y][i] == 'X')break;}for (int i=y; i>0; --i){if (map[i][x] == 1)return false;else if (map[i][x] == 'X')break;}return true;}void dfs(int x, int y, int cur){if (x == n+1){if (y == n){ans = ans>cur?ans:cur;return;}y++;x = 1;}if (!check(x, y)){dfs(x+1, y, cur);return;}map[y][x] = 1;dfs(x+1, y, cur+1);map[y][x] = '.';dfs(x+1, y, cur);}int main(){while (scanf("%d", &n), n){memset(map, 0, sizeof(map));for (int i=1; i<=n; ++i){scanf("%s", &map[i][1]);}ans = 0;dfs(1, 1, 0);printf("%d\n", ans);}return 0;}



0 0
原创粉丝点击