【HDOJ 1045】Fire Net--dfs

【HDOJ 1045】Fire Net

图题 可用dfs也可用二分图最大匹配 这里先上DFS做法 用了两个思路 一开始手残卡了半天……发现是回溯过程中把一个临时数组打乱了 无法还原 后来放在dfs函数内过了。。。

代码如下:

版本1:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

char mp[5][6];
bool vis[5][5];
int n;

int dfs(int x,int step)
{
    int i,j,m,k,l,ls[5][5];//需要开在dfs内
    m = step;
    for(i = x; i < n; ++i)
    for(j = 0; j < n; ++j)
    {
        if(mp[i][j] == 'X' || vis[i][j]) continue;
        for(k = 0; k < n; ++k)
        for(l = 0; l < n; ++l) ls[k][l] = vis[k][l];
        for(k = j; k < n && mp[i][k] != 'X'; ++k) vis[i][k] = 1;
        for(k = j; k >= 0 && mp[i][k] != 'X'; --k) vis[i][k] = 1;
        for(k = i; k < n && mp[k][j] != 'X'; ++k) vis[k][j] = 1;
        for(k = i; k >= 0 && mp[k][j] != 'X'; --k) vis[k][j] = 1;
        m = max(m,dfs(i,step+1));
        for(k = 0; k < n; ++k)
        for(l = 0; l < n; ++l) vis[k][l] = ls[k][l];
    }
    return  m;
}

int main()
{
    int i;
    while(~scanf("%d",&n) && n)
    {
            for(i = 0; i < n; ++i)
                scanf("%s",mp[i]);
            memset(vis,0,sizeof(vis));
            printf("%d\n",dfs(0,0));
    }
    return 0;
}

版本2:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

char mp[5][6];
int n;

bool can(int i,int j)
{
    int k,l;
    for(k = j+1; k < n && mp[i][k] != 'X'; ++k) if(mp[i][k] == '*') return 0;
    for(k = j-1; k >= 0 && mp[i][k] != 'X'; --k) if(mp[i][k] == '*') return 0;
    for(k = i+1; k < n && mp[k][j] != 'X'; ++k) if(mp[k][j] == '*') return 0;
    for(k = i-1; k >= 0 && mp[k][j] != 'X'; --k) if(mp[k][j] == '*') return 0;
    return 1;
}

int dfs(int x,int step)
{
    int i,j,m,f;
    m = step;
    for(i = x; i < n; ++i)
    for(j = 0; j < n; ++j)
    {
        f = 1;
        if(mp[i][j] == 'X' || mp[i][j] == '*') continue;
        mp[i][j] = '*';
        if(!can(i,j))
        {
            mp[i][j] = '.';
            continue;
        }
        m = max(m,dfs(i,step+1));
        mp[i][j] = '.';
    }
    return  m;
}

int main()
{
    int i;
    while(~scanf("%d",&n) && n)
    {
            for(i = 0; i < n; ++i)
                scanf("%s",mp[i]);
            printf("%d\n",dfs(0,0));
    }
    return 0;
}

你可能感兴趣的:(DFS)