Flood-it!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4127/http://acm.split.hdu.edu.cn/showproblem.php?pid=4127

IDA*

这题题意有点不清,我去找了这个游戏玩了会才明白什么回事= =

(游戏链接:http://unixpapa.com/floodit/?sz=26&nc=6

刚开始我将状态压缩成2^64(用unsigned long long存储,当n=8全部都是一种颜色时用(unsigned long long)(-1)特判),用map去重,dfs判断每次互通的格子,A*是该状态下的颜色种类-1,一次次迭代加深,结果是TLE...

代码如下:

 #include<cstdio>
#include<cmath>
#include<iostream>
#include<set>
#include<map>
#include<cstring>
#define N 8
using namespace std;
typedef unsigned long long LL;
int mp[N][N],n,deep;
bool vis[N][N],ok;
map<LL,bool>state;
int dx[]={-,,,};
int dy[]={,,-,};
LL dfs(int px,int py,int color,LL s){
LL sta=s;
vis[px][py]=;
for(int i=;i<;++i){
int x=px+dx[i];
int y=py+dy[i];
if(<=x&&x<n&&<=y&&y<n)
if(color==mp[x][y]||(sta&((LL)<<(x*n+y)))>)
if(!vis[x][y]){
sta|=((LL)<<(x*n+y));
sta|=dfs(x,y,color,sta);
}
}
return sta;
}
LL init(){
ok=;
state.clear();
memset(vis,,sizeof(vis));
return dfs(,,mp[][],);
}
int Astar(int color,LL s){
set<int>st;
st.insert(color);
for(int i=;i<n;++i)
for(int j=;j<n;++j)
if((s&(<<(i*n+j)))==)
if(st.count(mp[i][j])==)
st.insert(mp[i][j]);
return (st.size()-);
}
void IDAstar(int color,LL sta,int step){
if(ok)return;
if(n<){
if(sta==((LL)<<n*n)-){
ok=;
return;
}
}else{
if(sta==(LL)-){
ok=;
return;
}
}
int h=Astar(color,sta);
if(step+h>deep)return;
for(int i=;i<;++i){
memset(vis,,sizeof(vis));
LL s=dfs(,,i,sta);
if(!state[s]){
state[s]=;
IDAstar(i,s,step+);
state[s]=;
}
if(ok)return;
}
}
int main(void){
while(scanf("%d",&n)){
if(n==)break;
for(int i=;i<n;++i)
for(int j=;j<n;++j)
scanf("%d",&mp[i][j]);
LL s=init();
if(n<){
if(s==((LL)<<(n*n))-){
printf("0\n");
continue;
}
}else{
if(s==(LL)-){
printf("0\n");
continue;
}
}
for(deep=;!ok;deep++){
state.clear();
state[s]=;
IDAstar(mp[][],s,);
}
printf("%d\n",deep-);
}
}

请教了下艾神,他说不要去重,太慢Orz

好好想了下,好像确实有好多优化点:状态压缩,map去重,A*函数,每次都是dfs= =

之后改进后直接用state[N][N]存储当前状态(1表示与mp[0][0]点相通的格点,2表示与mp[0][0]相通格点邻接的不同格点,0表示剩余格点),用memery[N][N]存储上一个状态;每次染色时判断有没有新增格点(state[i][j]==2&&mp[i][j]==color)有的话才染色;每次dfs的只是这次需要染色的格点域。如此复杂度大大降低了!但是还是TLE了好几发,仔细检查才发现是估价函数A*写搓了QAQ

代码如下:

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<set>
#define N 8
#define M 6
#define met(x) memset(x,0,sizeof(x))
using namespace std;
int mp[N][N],n;
int state[N][N];
bool mark[M];
int dx[]={,,,-};
int dy[]={,,-,};
void dfs(int px,int py,int color){
state[px][py]=;
for(int i=;i<;++i){
int x=px+dx[i];
int y=py+dy[i];
if(<=x&&x<n&&<=y&&y<n)
if(state[x][y]!=){
if(mp[x][y]==color)dfs(x,y,color);
else state[x][y]=;
}
}
}
void init(){
met(state);
dfs(,,mp[][]);
}
int Astar(int color){
int sum=;
met(mark);
/**mark[color]=1; color不应该被mark,估价函数要写的好,搓一点都会TLE**/
for(int i=;i<n;++i)
for(int j=;j<n;++j)
if(state[i][j]!=&&!mark[mp[i][j]]){
mark[mp[i][j]]=;
sum++;
}
return sum;
}
int cnt(int color){
int sum=;
for(int i=;i<n;++i)
for(int j=;j<n;++j)
if(state[i][j]==&&mp[i][j]==color){
sum++;
dfs(i,j,color);
}
return sum;
}
bool IDAstar(int deep,int color){
if(deep<Astar(color))return ;
if(deep==)return ;
for(int i=;i<M;++i){
int memery[N][N];
memcpy(memery,state,sizeof(state));
if(cnt(i)==)continue;
if(IDAstar(deep-,i))return ;
memcpy(state,memery,sizeof(memery));
}
return ;
}
void debug(int i){
printf("\n-----debug %i -----\n",i);
}
int main(void){
while(scanf("%d",&n)){
if(n==)break;
for(int i=;i<n;++i)
for(int j=;j<n;++j)
scanf("%d",&mp[i][j]);
init();
int deep=Astar(mp[][]);
if(deep==){
printf("0\n");
}else{
while(!IDAstar(deep,mp[][]))deep++;
printf("%d\n",deep);
}
}
}

Flood-it!的更多相关文章

  1. SYN Flood测试

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

  2. 浅谈iptables防SYN Flood攻击和CC攻击

    ------------------------本文为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击------------------ ...

  3. SYN Flood应如何应对

    1 什么是SYN Flood攻击 在TCP三次握手时,服务器接收客户端的SYN请求,操作系统将为该请求分配一个TCP(Transmission Control Block),服务器返回一个SYN/AC ...

  4. Message Flood

    Message Flood Time Limit: 1500MS Memory limit: 65536K 题目描述 Well, how do you feel about mobile phone? ...

  5. 图像处理之泛洪填充算法(Flood Fill Algorithm)

    泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能.算法的原理很简单,就 ...

  6. Cisco 防止SYN Flood 攻击原理

    DoS(Denial of Service拒绝服务)和DDoS(Distributed Denial of Service分布式拒绝服务)攻击是大型网站和网络服务器的安全威胁之一.2000年2月,Ya ...

  7. Nginx下防御HTTP GET FLOOD(CC)攻击

    Nginx下防御HTTP GET FLOOD(CC)攻击 Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引Rambler使用. ...

  8. Codeforces gym 100685 F. Flood bfs

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

  9. 扯谈网络编程之Tcp SYN flood洪水攻击

    简单介绍 TCP协议要经过三次握手才干建立连接: (from wiki) 于是出现了对于握手过程进行的攻击.攻击者发送大量的SYN包,server回应(SYN+ACK)包,可是攻击者不回应ACK包,这 ...

  10. TCP洪水攻击(SYN Flood)的诊断和处理

    TCP洪水攻击(SYN Flood)的诊断和处理   SYN Flood介绍 前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood. SYN Flood是当前最流行的DoS(拒 ...

随机推荐

  1. 关于JavaMail

    一.概述 1.邮件协议: SMTP:(Simple Mail Transfer Protocol,简单邮件传输协议)发邮件协议: POP3:(Post Office Protocol Version ...

  2. Java SE ——TCP协议网络编程(三)

    之前的代码中关闭了 socket 对象的输入流与输出流,但并没有关闭掉socket 对象,会造成服务器资源的浪费,应通过调用 socket 的 close() 方法来关闭当前的socket 对象. 因 ...

  3. python 数据清洗之字符串处理

    在数据分析中,特别是文本分析中,字符处理需要耗费极大的精力, 因而了解字符处理对于数据分析而言,也是一项很重要的能力. 字符串处理方法 首先我们先了解下都有哪些基础方法 首先我们了解下字符串的拆分sp ...

  4. GroupingView点击分组标题不展开,或点击标题部分文字不展开

    GroupingView结构:    分组标题groupTextTpl是用两个DIV 来进行修饰的,在mouseDown时,EXT会查找css class=".x-grid-group-hd ...

  5. 使用 FormsAuthentication 来进行登录验证

    1.在web.config文件中,<system.web>/<authentication>配置节用于对验证进行配置.为<authentication>节点提供mo ...

  6. U31网管配置

    1.新建网元和子架配置: 在拓扑图空白处新建对象-创建承载传输网元-选择设备-填写网元名称(A).网元类型.IP(查询出SNP的),网关IP会自动在此基础上加2.如果数据库为空先选离线- 机架子架配置 ...

  7. SAP HANA procudure 创建用户

    SAP HANA中的用户是没有功能进行直接的拷贝的,但是我们可以通过建立存储过程调用,通过sql语句的方式进行拷贝: 存储过程定义如下,各位可根据自己的需求进行修改: CREATE PROCEDURE ...

  8. MySQL语句相关经验总结

    1. 字段自减 UPDATE `table_name` SET `total`=IF(`total` < 1, 0, `total`-1) WHERE `id` = 1; 一般在做字段减法的时候 ...

  9. OSI七层模型详解

    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...

  10. 《JavaScript网页经典特效300例》

    <JavaScript网页经典特效300例> 基础篇 进阶篇 高级篇