题意:

给了这样一张图 有两种状态:pushed(*)和unpushed(.)    为方便起见分别成为 开 和 关

改变一个点的开关状态 会同时改变与它相邻的点的开关状态  比如改变5,则2、3、4、6、8、9都会改变

N(行数)最多为6 即 最多21个点

求: 任意改变开关状态后 最多能有几个关着。

为什么这么像高斯消元!!!

每个点的状态只有开和关 总共就只有2^21个状态

dfs会爆栈!

所以bfs就行了! 把这些点的开关状态看成二进制 用0到$2^{21}$的数组来标记当前状态有没有出现过

 struct node
{
bool a[];
}front, rear;
queue<node> q;
int ans;
bool vis[];
int biao[]={, , , , , , };
int b[][]={
{,},
{-,},
{-,-},
{,},
{,},
{,},
{,-}
};
int l[], c[][];
void pre()
{
memset(l, , sizeof(l));
for(int i=;i<=;i++)
{
int x=;
while(biao[x]<i)
x++;
int y=i-x*(x-)/;
for(int k=;k<;k++)
{
int dx=x+b[k][];
int dy=y+b[k][];
if(dx>= && dx<= && dy>= && dy<=dx)
c[i][l[i]++]=dx*(dx-)/+dy;
}
}
}
void bfs(int n)
{
int d=;
for(int i=;i<=n;i++)
d=(d<<)+front.a[i];
vis[d]=;
q.push(front);
while(!q.empty())
{
front=q.front();
q.pop();
for(int i=;i<=n;i++)
if(!front.a[i])
{
rear=front;
for(int j=;j<l[i];j++)
rear.a[c[i][j]]=^front.a[c[i][j]];
d=;
int cnt=;
for(int j=;j<=n;j++)
{
d=(d<<)+rear.a[j];
if(!rear.a[j])
cnt++;
}
if(!vis[d])
{
vis[d]=;
ans=max(ans, cnt);
if(ans==n)
return ;
q.push(rear);
}
}
}
}
int main()
{
pre();
int n;
while(~scanf("%d", &n))
{
ans=;
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
{
char ch;
cin>>ch;
if(ch=='.')
ans++;
front.a[i*(i-)/+j]=(ch=='*');
}
n=(n+)*n/;
if(ans==n)
{
printf("%d\n", ans);
continue;
}
while(!q.empty())
q.pop();
memset(vis, , sizeof(vis));
bfs(n);
printf("%d\n", ans);
}
return ;
}

ZOJ 3038

[水题]ZOJ3038 Triangle War II的更多相关文章

  1. hdu 1140:War on Weather(计算几何,水题)

    War on Weather Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. BNU29064——硬币水题II——————【事件概率】

    硬币水题II Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: ...

  3. HDU 6300.Triangle Partition-三角形-水题 (2018 Multi-University Training Contest 1 1003)

    6300.Triangle Partition 这个题就是输出组成三角形的点的下标. 因为任意三点不共线,所以任意三点就可以组成三角形,直接排个序然后输出就可以了. 讲道理,没看懂官方题解说的啥... ...

  4. ACM水题

    ACM小白...非常费劲儿的学习中,我觉得目前我能做出来的都可以划分在水题的范围中...不断做,不断总结,随时更新 POJ: 1004 Financial Management 求平均值 杭电OJ: ...

  5. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem A: The 3n + 1 problem(水题)

    Problem A: The 3n + 1 problem Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 14  Solved: 6[Submit][St ...

  7. Atcoder 水题选做

    为什么是水题选做呢?因为我只会水题啊 ( 为什么是$Atcoder$呢?因为暑假学长来讲课的时候讲了三件事:不要用洛谷,不要用dev-c++,不要用单步调试.$bzoj$太难了,$Topcoder$整 ...

  8. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  9. NYOJ-525一道水题思路及详解

    一道水题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 今天LZQ在玩一种小游戏,但是这游戏数有一点点的大,他一个人玩的累,想多拉一些人进来帮帮他,你能写一个程序帮帮他 ...

随机推荐

  1. JS 日期工具类-基于yDate

    源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...

  2. SDK 组件 Qupaisdk 启动出错,错误消息为 [Qupaisdk], the android stack error message is Fail to start the plugin, which is caused by Failed resolution of: Lcom/duanqu/qupai/recorder/R$array;

    紧急解决办法: 将你的oneSDK(qupaiSDK)里面的manifest的pageckage改为:com.duanqu.qupai.recorder

  3. 学习笔记1_Day09_Servlet

    生命周期方法: l  void init(ServletConfig):出生之后(1次): l  void service(ServletRequest request, ServletRespons ...

  4. sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)(转)

    本文讲述了SQL SERVER中碎片产生的原理,内部碎片和外部碎片的概念.以及解决碎片的办法和填充因子.在数据库中,往往每一个对于某一方面性能增加的功能也会伴随着另一方面性能的减弱.系统的学习数据库知 ...

  5. GetDeviceCaps() 参数

    GetDeviceCaps 检测设备指定信息 参数: #define DRIVERVERSION 0 /* 设备驱动版本 */ #define TECHNOLOGY 2 /* Device class ...

  6. [jquery]高级篇--标签选择

    1>3中初始化 $(document).ready(function(){ alert("开始了"); }); $(function(){ trace("初始化方法 ...

  7. 17_高级映射:一对一查询(使用resultType)

    [数据库模型] [各个表] [ 用户表user ] 购买商品的用户信息. [ 订单表 ] 用户所创建的订单 [ 订单明细表 ] 订单的详细信息,即购买商品的信息 [ 商品表 ] 商品的具体信息 [有关 ...

  8. CAF(C++ actor framework)使用随笔(projection 用法)(一)

    最近干活在写毕设,用到了CAF,看了文档,发现了一些小坑,自己摸索写点随笔.(CAF的github网站 https://github.com/actor-framework/actor-framewo ...

  9. mysql innodb 数据打捞(三)innodb 簇不连接页的扫描提取(计划)

    操作系统簇大小一般是4K,而innoDB的页大小一般是16K,那么就有可能16K的页没有存储在连续的簇中,这样扫描软件就不会扫描出来这样的页面.为了解决这个问题,决定给软件增加半页扫描功能. 在第一次 ...

  10. JS拖拽原理

    实现拖拽效果主要跟鼠标的三个事件有关: onmousedown : 选择要拖拽的元素 onmousemove : 移动元素 onmouseup : 释放元素 三个事件的关系: obj.onmoused ...