热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bzoj3336Uva10572BlackandWhite

题目描述:数据范围:2

题目描述:

数据范围&#xff1a;2<&#61;n,m<&#61;8

 

题解&#xff1a;

很明显需要状压。但是怎么压不知道&#xff0c;压什么不知道。

然后从条件下手。

条件1要求黑色在一起白色在一起&#xff0c;记录轮廓线很容易做到。

条件2要求不能出现$2*2$的同色方格。我们还需要再记录当前位置的左上角。

所以这道题的轮廓线长这样。

丑图。

我们需要确定一个顺序记录哪几块互相联通。由于轮廓线奇特的形状我决定这样标号。

如果编号相同但是并不互相联通我们可以知道他俩不同颜色。

为了颜色我们决定记录某个块的颜色&#xff0c;这样可以得到所有颜色。

于是这道题表中存的就是$1$号颜色&#43;所有状态。

为了方便调试我用了十进制。

每次调用时都要解压&#xff0c;处理后压缩放回去。

由于第一行和第一列找不到长这样的轮廓线&#xff0c;我们可以搜出第一行所有状态&#xff0c;处理第一列时直接枚举黑色/白色。

接下来就是精彩的特判环节。

 

&#xff08;这一部分针对处于中心部位的一干普通点&#xff09;

 

以填黑色为例。

如果这里不能填黑&#xff1a;

1.输入要求白色。

2.拐角处已经有三个黑块。

3.要考虑到上图中红块填上后$5$号块就不再与不定颜色相邻&#xff0c;我们不能把$5$号块憋死我们要判断$5$号是否有与之联通的好朋友在轮廓线上。

类似围棋中的气。

如果没有而且$5$号是白的&#xff0c;那么就不能填黑&#xff01;

等等好像是错的。

如果红块已经到$(n,m-1)$或者是$(n,m)$&#xff0c;而且轮廓线上其他都是黑的&#xff0c;我们可以放黑色。

所以这又是个特判。

4.对于3我们考虑的是上下断开&#xff0c;能否出现左右断开&#xff1f;

当然可能。

但是只能在最后一行出现。

所以统计答案时要填回去看一眼。

 

真 恶心。

深思熟虑后糊上去的代码&#xff1a;

#include
#include

#include

using namespace std;
#define N 15
#define ll long long
int T,n,m,k,a[N][N];
char ch[N][N];
ll bas[N],ans;
struct Map
{
int hed[1000050],cnt[2];struct EG{int nxt;ll to,w;}e[2000050][2];void ae(int f,ll t,ll w){e[&#43;&#43;cnt[k]][k].to &#61; t;e[cnt[k]][k].nxt &#61; hed[f];e[cnt[k]][k].w &#61; w;hed[f] &#61; cnt[k];}void push(ll u,ll w){for(int j&#61;hed[u%1000000];j;j&#61;e[j][k].nxt)if(e[j][k].to&#61;&#61;u){e[j][k].w &#43;&#61; w;return ;}ae(u%1000000,u,w);}void clear(){cnt[k] &#61; 0;memset(hed,0,sizeof(hed));}
}mp;
int col[N],grp[N],tmp[N],las[N];
ll zip()
{ll ret
&#61; 0;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)ret&#61;10*(ret&#43;grp[i]);return ret&#43;col[1];
}
void upz(ll u)
{memset(tmp,
-1,sizeof(tmp));tmp[1]&#61;u%10;u/&#61;10;for(int i&#61;m&#43;1;i>&#61;1;i--,u/&#61;10)grp[i]&#61;u%10;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(tmp[grp[i]]&#61;&#61;-1)tmp[grp[i]]&#61;tmp[grp[i-1]]^1;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)col[i]&#61;tmp[grp[i]];
}
void shake()//get the express
{memset(tmp,0,sizeof(tmp));for(int cnt&#61;0,i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(!tmp[grp[i]])tmp[grp[i]]&#61;&#43;&#43;cnt;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)grp[i]&#61;tmp[grp[i]];
}
bool find_friend(int now,int beg,int ens)
{
int cnt &#61; 0;for(int i&#61;beg;i<&#61;ens;i&#43;&#43;)if(grp[i]&#61;&#61;now)cnt&#43;&#43;;return cnt>0;
}
bool ck1()
{
for(int i&#61;1;i<&#61;m;i&#43;&#43;)if(col[i]&#43;a[1][i]&#61;&#61;1)return 0;return 1;
}
bool ck2()
{
int cnt &#61; 0;for(int i&#61;2;i<&#61;m;i&#43;&#43;)cnt&#43;&#61;(col[i]!&#61;col[i-1]);return cnt<&#61;2;
}
int ck3(int c)
{
if(col[m-1]&#61;&#61;col[m]&&col[m]&#61;&#61;col[m&#43;1]&&col[m&#43;1]&#61;&#61;c)return 0;int c0 &#61; col[m],ret&#61;1;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)las[i]&#61;grp[i];col[m] &#61; c;grp[m] &#61; m&#43;2;if(col[m-1]&#61;&#61;c){int kg &#61; grp[m-1];for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(grp[i]&#61;&#61;kg)grp[i]&#61;m&#43;2;}if(col[m&#43;1]&#61;&#61;c){int kg &#61; grp[m&#43;1];for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(grp[i]&#61;&#61;kg)grp[i]&#61;m&#43;2;}shake();for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(grp[i]>2)ret &#61; 0;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)grp[i] &#61; las[i];if(col[m-1]&#61;&#61;c){int kg &#61; grp[m-1];for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(grp[i]&#61;&#61;kg)grp[i]&#61;m&#43;2;}if(col[m&#43;1]&#61;&#61;c){int kg &#61; grp[m&#43;1];for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(grp[i]&#61;&#61;kg)grp[i]&#61;m&#43;2;}shake();for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)if(grp[i]>2)ret &#61; 0;for(int i&#61;1;i<&#61;m&#43;1;i&#43;&#43;)grp[i]&#61;las[i];col[m] &#61; c0;return ret;
}
void PushF()
{
for(int i&#61;0;i<(1<){for(int j&#61;1;j<&#61;m;j&#43;&#43;)col[j]&#61;(i>>(j-1))&1;if(!ck1())continue;if(!ck2())continue;grp[1]&#61;1;for(int j&#61;2;j<&#61;m&#43;1;j&#43;&#43;)if(col[j]&#61;&#61;col[j-1])grp[j]&#61;grp[j-1];else grp[j]&#61;grp[j-1]&#43;1;mp.push(zip(),1);}
}
bool check_b(int i,int j)
{
if(a[i][j]&#61;&#61;0)return 0;if(col[j-1]&#61;&#61;1&&col[j]&#61;&#61;1&&col[j&#43;1]&#61;&#61;1)return 0;if((i!&#61;n||j!&#61;m)&&(i!&#61;n||j!&#61;m-1))if(col[j&#43;1]&#61;&#61;0&&!find_friend(grp[j&#43;1],j&#43;2,m&#43;1)&&!find_friend(grp[j&#43;1],1,j-1))return 0;return 1;
}
bool check_w(int i,int j)
{
if(a[i][j]&#61;&#61;1)return 0;if(col[j-1]&#61;&#61;0&&col[j]&#61;&#61;0&&col[j&#43;1]&#61;&#61;0)return 0;if((i!&#61;n||j!&#61;m)&&(i!&#61;n||j!&#61;m-1))if(col[j&#43;1]&#61;&#61;1&&!find_friend(grp[j&#43;1],j&#43;2,m&#43;1)&&!find_friend(grp[j&#43;1],1,j-1))return 0;return 1;
}
int main()
{
// freopen("tt.in","r",stdin);scanf("%d",&T);bas[0]&#61;1;for(int i&#61;1;i<&#61;10;i&#43;&#43;)bas[i] &#61; 10*bas[i-1];while(T--){scanf("%d%d",&n,&m);for(int i&#61;1;i<&#61;n;i&#43;&#43;){scanf("%s",ch[i]&#43;1);for(int j&#61;1;j<&#61;m;j&#43;&#43;){if(ch[i][j]&#61;&#61;&#39;o&#39;)a[i][j]&#61;0;else if(ch[i][j]&#61;&#61;&#39;#&#39;)a[i][j]&#61;1;else a[i][j]&#61;2;}}ans&#61;0,k&#61;0,mp.clear();PushF();for(int i&#61;2;i<&#61;n;i&#43;&#43;){k^&#61;1;mp.clear();for(int j&#61;1;j<&#61;mp.cnt[!k];j&#43;&#43;){ll now &#61; mp.e[j][!k].to,val &#61; mp.e[j][!k].w;upz(now);for(int o&#61;m&#43;1;o>&#61;2;o--)grp[o]&#61;grp[o-1],col[o]&#61;col[o-1];for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)las[q]&#61;grp[q];if(a[i][1]!&#61;0)//black
{if(col[2]&#61;&#61;1){col[1]&#61;1,grp[1]&#61;grp[2];shake();mp.push(zip(),val);}else{if(find_friend(grp[2],3,m&#43;1)){col[1]&#61;1,grp[1]&#61;m&#43;2;shake();mp.push(zip(),val);}else if(i&#61;&#61;n&&m&#61;&#61;2){col[1]&#61;1,grp[1]&#61;m&#43;2;shake();mp.push(zip(),val);}}}for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)grp[q]&#61;las[q];if(a[i][1]!&#61;1)//white
{if(col[2]&#61;&#61;0){col[1]&#61;0,grp[1]&#61;grp[2];shake();mp.push(zip(),val);}else{if(find_friend(grp[2],3,m&#43;1)){col[1]&#61;0,grp[1]&#61;m&#43;2;shake();mp.push(zip(),val);}else if(i&#61;&#61;n&&m&#61;&#61;2){col[1]&#61;0,grp[1]&#61;m&#43;2;shake();mp.push(zip(),val);}}}}for(int j&#61;2;j<&#61;m;j&#43;&#43;){k^&#61;1,mp.clear();for(int o&#61;1;o<&#61;mp.cnt[!k];o&#43;&#43;){ll now &#61; mp.e[o][!k].to,val &#61; mp.e[o][!k].w;upz(now);int c0 &#61; col[j];if(i&#61;&#61;n&&j&#61;&#61;m){if(n&#61;&#61;2&&m&#61;&#61;2){if(col[1]&#61;&#61;col[3]){if((a[n][m]&#61;&#61;2||a[n][m]!&#61;col[1])&&col[2]&#61;&#61;col[1])ans&#43;&#61;val*ck3(col[1]^1);else if((a[n][m]&#61;&#61;2||a[n][m]&#61;&#61;col[1])&&col[2]!&#61;col[1])ans&#43;&#61;val*ck3(col[1]);}else{if(a[n][m]&#61;&#61;2)ans&#43;&#61;val*(ck3(0)&#43;ck3(1));else ans&#43;&#61;val*ck3(a[n][m]);}}else{if(col[m-1]&#61;&#61;col[m&#43;1]){if(a[n][m]&#61;&#61;2||a[n][m]&#61;&#61;col[m-1])ans&#43;&#61;val*ck3(col[m-1]);}else{if(a[n][m]&#61;&#61;2)ans&#43;&#61;val*(ck3(0)&#43;ck3(1));else ans&#43;&#61;val*ck3(a[n][m]);}}continue;}if(check_b(i,j))//black
{col[j]&#61;1;grp[j]&#61;m&#43;2;for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)las[q]&#61;grp[q];if(col[j-1]&#61;&#61;1){int kg &#61; grp[j-1];for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)if(grp[q]&#61;&#61;kg)grp[q]&#61;m&#43;2;}if(col[j&#43;1]&#61;&#61;1){int kg &#61; grp[j&#43;1];for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)if(grp[q]&#61;&#61;kg)grp[q]&#61;m&#43;2;}shake();if(i&#61;&#61;n&&j&#61;&#61;m)ans&#43;&#61;val;mp.push(zip(),val);for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)grp[q]&#61;las[q];}col[j] &#61; c0;if(check_w(i,j))//white
{col[j]&#61;0;grp[j]&#61;m&#43;2;if(col[j-1]&#61;&#61;0){int kg &#61; grp[j-1];for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)if(grp[q]&#61;&#61;kg)grp[q]&#61;m&#43;2;}if(col[j&#43;1]&#61;&#61;0){int kg &#61; grp[j&#43;1];for(int q&#61;1;q<&#61;m&#43;1;q&#43;&#43;)if(grp[q]&#61;&#61;kg)grp[q]&#61;m&#43;2;}shake();if(i&#61;&#61;n&&j&#61;&#61;m)ans&#43;&#61;val;mp.push(zip(),val);}}}}printf("%lld\n",ans);}return 0;
}

 

转:https://www.cnblogs.com/LiGuanlin1124/p/10233772.html



推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
author-avatar
isme7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有