UVALive 6454 Lights Against Dudely dfs

来源:互联网 发布:北京润和软件 编辑:程序博客网 时间:2024/05/16 07:01

题意:给出n*m个屋子,其中‘.’为需要点亮的房间。每盏灯都放在可以点亮的房间,并且其可以点亮(x,y)、(x-1,y)、(x,y+1)的房间。有且仅有一盏灯可以旋转。‘.’房间 最多有15个。一定不能点亮‘#’的房间,求最少需要多少灯?


由于有效的房间最多15个,所以暴力dfs即可,当然状压枚举也行。这题题目太长,少看了一个条件wa到跪。。。


#include <iostream>#include<bits/stdc++.h>using namespace std;const int N=550;const int INF=11000000;int dir[4][2]={-1,0,0,1,1,0,0,-1};int n,m,ans,f,x[N],y[N],cnt,v[N][N];char s[N][N];void dfs(int t,int sum,int c);void dfs1(int t,int sum,int c,int d1){    int x1=x[t]+dir[d1][0],y1=y[t]+dir[d1][1];    int x2=x[t]+dir[(d1+1)%4][0],y2=y[t]+dir[(d1+1)%4][1];    if(!((x1<n&&x1>=0&&y1>=0&&y1<m&&s[x1][y1]=='#')||(x2<n&&x2>=0&&y2>=0&&y2<m&&s[x2][y2]=='#')))    {        int flag1=1,flag2=1;        if(x1<n&&x1>=0&&y1>=0&&y1<m&&v[x1][y1]==0)  flag1=0;        if(x2<n&&x2>=0&&y2>=0&&y2<m&&v[x2][y2]==0)  flag2=0;        if(!(v[x[t]][y[t]]&&flag1&&flag2))//如果操作必须至少能点亮一个房间,剪枝        {            int cc=!flag1+!flag2+!v[x[t]][y[t]];//增加的点亮房间            v[x[t]][y[t]]=1;            if(!flag1)    v[x1][y1]=1;            if(!flag2)    v[x2][y2]=1;            if(d1!=0)   f=1;            dfs(t+1,sum+1,c+cc);            if(d1!=0)   f=0;            v[x[t]][y[t]]=0;            if(!flag1)    v[x1][y1]=0;            if(!flag2)    v[x2][y2]=0;        }    }}void dfs(int t,int sum,int c){    if(sum>=ans)    return;    if(c==cnt)    {        if(sum<ans) ans=sum;        return ;    }    if(t==cnt)    {        if(c<cnt)   return;        if(sum<ans) ans=sum;        return ;    }    dfs(t+1,sum,c);    dfs1(t,sum,c,0);    if(f==0)    {        for(int i=1;i<4;i++)    dfs1(t,sum,c,i);    }}int main(){    while(~scanf("%d%d",&n,&m)&&(n||m))    {        cnt=0;        for(int i=0;i<n;i++)        {            scanf("%s",s[i]);            for(int j=0;j<m;j++)            {                if(s[i][j]=='.')                {                    x[cnt]=i;                    y[cnt++]=j;                }            }        }        if(cnt==0)        {            printf("0\n");            continue;        }        ans=INF;        f=0;        dfs(0,0,0);        if(ans>=INF)    ans=-1;        printf("%d\n",ans);    }}

原创粉丝点击