1045--Fire Net

原题链接


http://acm.hdu.edu.cn/showproblem.php?pid=1045

Sample Input
4
.X..
….
XX..
….
2
XX
.X
3
.X.
X.X
.X.
3

.XX
.XX
4
….
….
….
….
0

Sample Output
5
1
5
2
4


解题思路


首先这个是八皇后的高级变形问题。
起初我也是按八皇后的思路在想,可就是想不明白,于是换种思路,对每个格子进行试探,试探之后,然后判断这个格子能不能放,一共也就16个格子,


代码


#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 5;
char ma[maxn][maxn];
int n,cnt,maxx;
//判断此位置放了之后,冲不冲突
int isTrue(int x, int y)
{
    //向上检测
    for(int i=y; i>-1; --i)
    {
        if(ma[x][i] == '1')
            return 0;
        if(ma[x][i] == 'X')
            break;
    }
    //向下检测
    for(int i=y; i<n; ++i)
    {
        if(ma[x][i] == '1')
            return 0;
        if(ma[x][i] == 'X')
            break;
    }
    //向左检测
    for(int i=x; i>-1; --i)
    {
        if(ma[i][y] == '1')
            return 0;
        if(ma[i][y] == 'X')
            break;
    }
    for(int i=x; i<n; ++i)
    {
        if(ma[i][y] == '1')
            return 0;
        if(ma[i][y] == 'X')
            break;
    }
    return 1;
}
void dfs()
{
   if(cnt > maxx)
    maxx = cnt;
   for(int x=0; x<n; ++x)
   {
       for(int y=0; y<n; ++y)
       {
           if(ma[x][y] == 'X' || ma[x][y] == '1')
                continue;
           if(!isTrue(x,y))
                continue;
           cnt++;
           ma[x][y] = '1';
           dfs();
           cnt--;
           ma[x][y] = '.';
       }
   }

}
int main()
{
    while(cin >> n)
    {
        if(!n)
            break;
        cnt = 0,maxx = 0;
        for(int i=0; i<n; ++i)
            cin >> ma[i];
        dfs();
        cout << maxx <<endl;
    }

    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务