HDU1045:Fire Net(DFS)

Fire Net

#include <bits/stdc++.h>
using namespace std;

int Maxn, n;
char board[5][5];

bool canPut(int x, int y) {
    if(board[x][y] == 'X')
        return false ;//can't put in this place

    int i,j;
    for(i = x-1 ; i >= 0; --i) {
        if( board[i][y] == 'X')
            break; //if there is a wall,would be ok

        if(board[i][y] == '$')//this rows exist an bomb
            return false;
    }

    for(j = y-1; j >= 0; --j) {
        if( board[x][j] == 'X')//if there is a wall,would be ok
            break;

        if( board[x][j] == '$')
            return false;
    }

    return true;
}

void dfs(int num, int index) {
    if(index == n * n) {//收到最后了
        Maxn = max(Maxn, num);
        return;
    }

    int x = index / n;
    int y = index % n;
    if(canPut(x, y)) {//能放
        char c = board[x][y];
        board[x][y] = '$';//放
        dfs(num+1, index+1);

        board[x][y] = c;//回溯
        dfs(num, index+1);//不放
    } else {//不能放
        dfs(num, index+1);
    }
}

int main() {
    freopen("data.in", "r", stdin);
    while(cin >> n && n != 0) {
        int i, j;
        Maxn = INT_MIN;
        for( i = 0; i < n; ++i)
            for(j = 0; j < n; ++j)
                cin >> board[i][j];

        dfs(0, 0);//初始状态炮台数,索引都为0
        cout<<Maxn<<endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值