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

poj 1038 Bugs Integrated, Inc.

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

poj 1038 Bugs Integrated, Inc.

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,k,x,y,ans,o;int three[15],q[15],p[15],map[160][15],f[2][60000];void pre(){   three[0] = 1;   for (int i = 1;i <= 11;i ++) three[i] = three[i - 1] * 3;}int update(int* p,int* q,int i,int j){   int cnt = 0,res = 0;   memset(q,0,sizeof q);   memset(p,0,sizeof p);   for (int k = 1;k <= m;k ++){       p[k] = j % 3;       j /= 3;   }   for (int k = 0;k < m;k ++){       if (map[i][k + 1]) q[k + 1] = 2,res += three[k] * 2;       else if (p[k + 1] == 2) q[k + 1] = 1,res += three[k];       else if (p[k + 1] < 2) q[k + 1] = 0;   }   return res;}void dfs(int now,int y,int r){   if (now > ans) ans = now;   if (y + 1 <= m && p[y] == 0 && p[y + 1] == 0 && q[y] == 0 && q[y + 1] == 0){       q[y] = 2;       q[y + 1] = 2;       int i = r + three[y - 1] * 2 + three[y] * 2;       if (now + 1 > f[o][i]) f[o][i] = now + 1;       dfs(now + 1,y + 2,i);       q[y] = 0;       q[y + 1] = 0;   }   if (y + 2 <= m && q[y] == 0 && q[y + 1] == 0 && q[y + 2] == 0){       q[y] = q[y + 1] = q[y + 2] = 2;       int i = r + three[y - 1] * 2 + three[y] * 2 + three[y + 1] * 2;       if (now + 1 > f[o][i]) f[o][i] = now + 1;       dfs(now + 1,y + 3,i);       q[y] = q[y + 1] = q[y + 2] = 0;   }   if (now > f[o][r]) f[o][r] = now;   if (y + 1 <= m) dfs(now,y + 1,r);}int main(){   int T;   cin >> T;   pre();   while (T --){       scanf("%d%d%d",&n,&m,&k);       memset(map,0,sizeof map);       for (int i = 1;i <= k;i ++){scanf("%d%d",&x,&y);map[x][y] = 1;       }       x = 0;       for (int i = 1;i <= m;i ++){if (map[1][i]) x += 2 * three[i - 1];else x += three[i - 1];       }       o = 0;       memset(f,-1,sizeof f);       f[o][x] = 0;       ans = 0;       for (int i = 2;i <= n;i ++){o = 1 - o;memset(f[o],-1,sizeof f[o]);for (int j = 0;j < three[m];j ++) if (f[1 - o][j] != -1){    int r = update(p,q,i,j);    dfs(f[1 - o][j],1,r);}       }       cout << ans << endl;   }   return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377189.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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