调得我快死了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!


先自己写了几发,老是 T,然后去看题解,大体思路居然都差不多,估计是自己写挂了orz。

几乎所有题解都有个vis数组,真 nm 看不懂到底是什么意思啊啊啊!!!

然后照着题解打了一遍后好像明白了……emmm……

vis为 1 时代表当前位置与 (0,0) 颜色相同并且联通,等于 2 时代表与 (0,0) 颜色不同但修改颜色时可能会变得联通(即和值为一的位置相邻)。

每次选择一个当前值等于 2 的位置(即这个位置可扩展连通块),以它为中心求一下vis数组,这样很巧妙地避免了从 (0,0) 重新染色。

这么妙啊……这个vis数组还真没想到……

#include <bits/stdc++.h>
using namespace std; const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,a[8][8],cpy[50][8][8],vis[8][8]; void paint(int x,int y,int c)
{
vis[x][y]=1;
for(int i=0;i<4;++i)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx<0||ny<0||nx>=n||ny>=n) continue;
if(vis[nx][ny]==1) continue;
vis[nx][ny]=2;
if(a[nx][ny]==c) paint(nx,ny,c);
}
} int f()
{
int ans=0;
static bool cnt[6];
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(!cnt[a[i][j]]&&vis[i][j]!=1)
cnt[a[i][j]]=1,++ans;
return ans;
} bool dfs(int dep,int max_dep)
{
int t=f();
if(dep+t>max_dep) return 0;
if(!t) return 1;
memcpy(cpy[dep],vis,sizeof(vis));
for(int i=0;i<6;++i)
{
bool fl=0;
for(int x=0;x<n;++x)
for(int y=0;y<n;++y)
if(a[x][y]==i&&vis[x][y]==2)
{
fl=1;paint(x,y,i);
}
if(fl&&dfs(dep+1,max_dep)) return 1;
memcpy(vis,cpy[dep],sizeof(vis));
}
return 0;
} int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
scanf("%d",&a[i][j]);
memset(vis,0,sizeof(vis));
paint(0,0,a[0][0]);
int dep=0;
while(!dfs(0,dep)) ++dep;
printf("%d\n",dep);
}
return 0;
}

POJ4007 Flood-it! 题解的更多相关文章

  1. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  2. Codeforces gym 100685 F. Flood bfs

    F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...

  3. 【Luogu3457】POW-The Flood(并查集)

    [Luogu3457]POW-The Flood(并查集) 题面 洛谷 题解 我们知道,如果一个点和一个海拔不高于它的点相连 那么连在那个点是更优的,所以考虑按照每个点的海拔排序 既然按照海拔排序,相 ...

  4. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  5. [洛谷3457][POI2007]POW-The Flood

    洛谷题目链接:[POI2007]POW-The Flood 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方 ...

  6. Codeforces Round #538 (Div. 2) (A-E题解)

    Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...

  7. 洪水(flood)

    洪水(flood) 题目背景 Awson是某国际学校信竞组的一只菜鸡.今年,该市发生了千年难遇的洪水.被监禁在学校的Awson不甘怠堕,想将自己投入到公益服务事业中去.这天,他偷了H老师的小电驴,偷偷 ...

  8. SYN Flood测试

    由于工作需要对公司进行SYN Flood测试,在网上查了些资料,Youtube上找到最多的方法就是hping3工具来实现, 该工具已经预装在Kali下,具体操作用一条命令即可实现. hping3 -S ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. 硬核!2w 字长文爆肝分布式事务知识点!!

    前言 分布式事务,是分布式架构中一个绕不开的话题,而什么是分布式事务?为什么要使用分布式事务?分布式事务有哪些实现方案?更是面试时面试官特别喜欢的一个分布式三连炮!同时用XMind画了一张导图记录分布 ...

  2. Redis系列(五):消息队列

    消息队列已经成为现在互联网服务端的标配组件,现在比较常用的消息中间件有RabbitMQ.Kafka.RocketMQ.ActiveMQ.说出来你可能不信,Redis作为一个缓存中间件,居然也提供了消息 ...

  3. 三、使用sudo分配管理权限

    使用sudo分配管理权限 su命令 su -  [账户名称]     :切换到用户,不加用户名默认切换到root su -  [账户名称]  -c  '命令'   :以xx用户身份执行命令,注意命令需 ...

  4. 配置IPv6公网地址DDNS并开放外网访问端口

    目前使用三大运营商宽带服务都会下发公网IPv6地址,这样我们想要在外网访问家里的路由.NAS等设备就可以直接通过IPv6地址来访问了.但是每次重新拨号后IPv6地址都会改变,而且IPv6的地址很长,这 ...

  5. 【题解】localmaxima 数论

    # T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...

  6. 一个SQLServer中JSON文档型数据的查询问题

    近日在项目中遇到一个问题: 如何在报表中统计JSON格式存储的数据? 例如有个调查问卷记录表,记录每个问题的答案. 其结构示意如下(横表设计) Id user date Q1_Answer Q2_An ...

  7. react 的优点

    1. 声明式开发 react 是声明式的开发方式,与之对应的是命令式开发方式.之前用jquery写代码的时候,我们都是直接操作dom,这种我们称为命令式的编程.命令式编程需要我们一点点的告诉dom,它 ...

  8. excel替换函数substitute

    1.substitute(需要执行替换操作的单元格区域,旧文本,新文本,第N个旧内容) 例:substitute(A1,"a","b",2)    A1=aab ...

  9. Kubernetes将弃用docker?

    1.前言 近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时.并在1.23后不再支持dock ...

  10. 10、mysql增量恢复实战

    10.1.实验数据: mysql> select * from test; +----+------+------+ | id | name | age | +----+------+----- ...