CodeForces 142C Help Caretaker

来源:互联网 发布:算法的设计原则 编辑:程序博客网 时间:2024/06/06 00:44

http://codeforces.com/problemset/problem/142/C

算是水果的,因为真正的剪枝应该是除以5,但是总超时,改成除以6,居然过了。。。


#include<iostream>#include<cmath>#include<cstdio>#include<sstream>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<ctime>#include<bitset>#define eps 1e-6#define INF 0x3f3f3f3f#define PI acos(-1.0)#define ll __int64#define LL long long#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1#define M 1005#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;int n,m;int maps[11][11];int a[4][5][2]={ {{0,0},{0,1},{0,2},{1,1},{2,1}},                 {{0,0},{1,-2},{1,-1},{1,0},{2,0}},                 {{0,0},{1,0},{2,-1},{2,0},{2,1}},                 {{0,0},{1,0},{1,1},{1,2},{2,0}}                };int ans;int v[200];int ANS[200];int top;bool isok(int x,int y){    return x>=0&&x<n&&y>=0&&y<m;}struct point{    int x,y;};bool istrue(int x,int y,int k,point save[]){    for(int i=0;i<5;i++)    {        int nx=x+a[k][i][0];        int ny=y+a[k][i][1];        if(!isok(nx,ny)) return false;        if(maps[nx][ny]) return false;        point t;        t.x=nx;        t.y=ny;        save[i]=t;    }    for(int i=0;i<5;i++)    {        maps[save[i].x][save[i].y]=1;    }    return true;}void dfs(int x,int y,int tot){    if(y==m)    {        y=0;        x++;    }    if((n*m-x*m+y)/6+tot<=ans&&ans) return;    if(x>=n)    {        if(tot>ans||ans==0)        {            ans=tot;            for(int i=0;i<top;i++)            {                ANS[i]=v[i];            }        }        return;    }    for(int i=0;i<5;i++)    {        if(i==4)        {            v[top++]=i;            dfs(x,y+1,tot);            top--;            continue;        }        point save[5];        if(istrue(x,y,i,save))        {            v[top++]=i;            dfs(x,y+1,tot+1);            for(int j=0;j<5;j++)            {                maps[save[j].x][save[j].y]=0;            }            top--;        }    }}char pri[15][15];int main(){    while(~scanf("%d%d",&n,&m))    {        memset(maps,0,sizeof(maps));        ans=top=0;        char word='A';        dfs(0,0,0);        printf("%d\n",ans);        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                pri[i][j]='.';            }        }        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(ANS[i*m+j]==4) {continue;}                for(int k=0;k<5;k++)                {                    pri[i+a[ANS[i*m+j]][k][0]][j+a[ANS[i*m+j]][k][1]]=word;                }                word++;            }        }        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                printf("%c",pri[i][j]);            }            puts("");        }    }    return 0;}


原创粉丝点击