栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3732 Paint Me Less

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3732 Paint Me Less

#include<cstdio>#include<cstring>#include<bitset>using namespace std;int maze[5][5];bool ucol[20];int lx,ly;int dep;inline int h(){    bool col[20];    memset(col,false,sizeof(col));    for(int i=0;i<lx;i++){        for(int j=0;j<ly;j++){ col[maze[i][j]]=true;        }    }    int cnt=0;    for(int i=1;i<20;i++){        cnt+=col[i];    }    return cnt;}int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};void fill(int x,int y,int c){    int tc=maze[x][y];    maze[x][y]=c;    for(int i=0;i<4;i++){        int tx=x+dir[i][0];        int ty=y+dir[i][1];        if(tx<0||ty<0||tx>=lx||ty>=ly) continue;        if(maze[tx][ty]!=tc) continue;        fill(tx,ty,c);    }}bitset<1000007> vis[17];unsigned zip(){    unsigned z=0;    for(int i=0;i<lx;i++){        for(int j=0;j<ly;j++){ z=maze[i][j]+z*131;        }    }    return z%1000007;}int ans[20][3];bool dfs(int d){    int th=h();    if(d==dep) return !th;    if(d+th>dep) return false;    for(int i=0;i<lx;i++){        for(int j=0;j<ly;j++){ bool tcol[20]; memset(tcol,false,sizeof(tcol)); tcol[0]=true; for(int k=0;k<4;k++){     int tx=i+dir[k][0];     int ty=j+dir[k][1];     if(tx<0||ty<0||tx>=lx||ty>=ly) continue;     tcol[maze[tx][ty]]=true; } for(int k=0;k<20;k++){     if(k==maze[i][j]) continue;     if(!tcol[k]) continue;     int tmp[5][5];     memcpy(tmp,maze,sizeof(tmp));     fill(i,j,k);     ans[d][0]=i; ans[d][1]=j; ans[d][2]=k;     int _z=zip();     if(vis[d][_z]){         memcpy(maze,tmp,sizeof(tmp));         continue;     }     vis[d][_z]=true;     if(dfs(d+1)) return true;     memcpy(maze,tmp,sizeof(tmp)); }        }    }    return false;}int main(){    while(~scanf("%d%d",&lx,&ly)){        memset(ucol,false,sizeof(ucol));        ucol[0]=true;        for(int i=0;i<lx;i++){ for(int j=0;j<ly;j++){     scanf("%d",&maze[i][j]);     ucol[maze[i][j]]=true; }        }        dep=0;        while(true){ for(int i=0;i<dep;i++) vis[i].reset(); if(dfs(0)) break; dep++;        }        printf("%dn",dep);        for(int i=0;i<dep;i++){ printf("%d %d %dn",ans[i][0]+1,ans[i][1]+1,ans[i][2]);        }    }}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号