hdu5301and15年多校集训1002题(builds)(dfs)

来源:互联网 发布:mac必备软件 知乎 编辑:程序博客网 时间:2024/06/16 16:19

题目大意:给你矩形的长和宽,他被很多单位为1的小正方形组成,还有一个黑块给了它的坐标,代表窗户,把这个矩形分割,每个分割的块,挨着黑块,或者边沿才行

解题思路:一种是根据图形来拼接而成,一种是dfs(q神的代码)

注意:其实分割之后,只能是长条状的块(n*1),如果不是,则可以分割为长条状的块

方法一:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,m,x,y,r;int  main(){        while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)        {                if(n>m)  {swap(n,m);swap(x,y);}                r=(n+1)/2;                int  c=min(y,m-y+1);                int  d=max(x-1,n-x);                if(r<c&&x - 1 != n - x) r=min(c,d);                if(n==m&&(n&1)&&x==y&&(x*2-1==n)) r=n/2;                printf("%d\n",r);        }}
方法二:dfs(code from quailty)
#include<cstdio>//q神制造#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#include<set>using namespace std;const int d[4][2]={{1,0},{0,1},{-1,0},{0,-1}};const int INF=0x3f3f3f3f;int n,m,ans;set<pair<int,int> >mp;int get_dis(int x,int y,int dir){    if(dir==0)return n+1-x;    if(dir==1)return m+1-y;    if(dir==2)return x;    if(dir==3)return y;}void dfs(int x,int y,int dir,int cur){    if(dir==4)    {        ans=min(ans,cur);        return;    }    int tx=x+d[dir][0];    int ty=y+d[dir][1];  //  if(tx>n||ty>m) return;    for(int i=0;i<4;i++)    {        if(i==(dir+2)%4)   continue;//如果是他的反方向        if(mp.find(make_pair(tx+d[i][0],ty+d[i][1]))==mp.end())        {            mp.insert(make_pair(tx+d[i][0],ty+d[i][1]));            dfs(x,y,dir+1,max(cur,get_dis(tx,ty,i)));            mp.erase(make_pair(tx+d[i][0],ty+d[i][1]));        }    }}int main(){    int x,y;    while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)    {        mp.clear();        ans=INF;        dfs(x,y,0,0);        if(n%2==1 && m%2==1 && x==(n+1)/2 && y==(m+1)/2)        {        }        else ans=max(ans,min((n+1)/2,(m+1)/2));        printf("%d\n",ans);    }    return 0;}



0 0
原创粉丝点击