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


先自己写了几发,老是 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. go 技巧: 实现一个无限 buffer 的 channel

    前言 总所周知,go 里面只有两种 channel,一种是 unbuffered channel, 其声明方式为 ch := make(chan interface{}) 另一种是 buffered ...

  2. P1123 取数游戏

    题目描述 一个N \times MN×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻88个格子中的一个即认为这两个数字相邻),求取 ...

  3. 实验2、Flask模板、表单、视图和重定向示例

    实验内容 1. 实验内容 表单功能与页面跳转功 能是Web应用程序的基础功能,学习并使用他们能够更好的完善应用程序的功能.Flask使用了名为Jinja2的模板引擎,该引擎根据用户的交互级别显示应用程 ...

  4. SpringBoot面试题 (史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  5. daily plan

    想了想自己留的坑有点多了,写个计划提醒自己 一些没做出来的题 csp-s模拟测试54 z csp-s模拟测试b层加餐 string 平衡树+并查集 因为某杰的**安排,没时间改了csp-s模拟测试47 ...

  6. Qt实现基于多线程的文件传输(服务端,客户端)

    1. 效果 先看看效果图 这是传输文件完成的界面 客户端 服务端 2. 知识准备 其实文件传输和聊天室十分相似,只不过一个传输的是文字,一个传输的是文件,而这方面的知识,我已经在前面的博客写过了,不了 ...

  7. 关于DWG文件转换成PDF

    最近有这样一个需求,客户会提供DWG文件,因为DWG文件是不能直接在网页上显示的,所以必须对他做处理,要求是转换成PDF格式.我查了很久的资料,很多都是基于C#和.NET的方法,而且都是说的很模糊,不 ...

  8. 简聊DFA(确定性有限状态自动机)

    状态机理论最初的发展在数字电路设计领域.而在软件设计领域,状态机设计的理论俨然已经自成一体. 状态机是软件编程中的一个重要概念,比这个概念更重要的是对它的灵活应用.在一个思路清晰而且高效的程序中,必然 ...

  9. Redis之Sentinel

    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的.可喜的是Redis从 2.8 ...

  10. POJ 1696 Space Ant 点积计算夹角

    题意: 一只特别的蚂蚁,只能直走或者左转.在一个平面上,有很多株植物,这只蚂蚁每天需要进食一株,这只蚂蚁从起点为(0,miny)的点开始出发.求最多能活多少天 分析: 肯定是可以吃到所有植物的,以当前 ...