【HDOJ 1045】Fire Net--dfs

来源:互联网 发布:佳能mp288软件下载 编辑:程序博客网 时间:2024/06/04 18:54

【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;}
0 0
原创粉丝点击