题意:

给了这样一张图 有两种状态: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. php入门实现留言板

    首先由一个文本文档read.txt liulan.html <!doctype html> <html lang="en"> <head> &l ...

  2. 【转】ODBC和OLEDB的连接字符串

    ODBC连接 适合数据库类型 连接方式access  "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pas ...

  3. Aix命令大全

    AIX服务器系统命令简介 在AIX操作系统上有很多的命令.这里介绍一些系统级的命令,它将有助于回答一些常见问题.大家以此做参考,并补充修改. 以下命令在AIX 5.1上测试通过. 正文 以下命令在AI ...

  4. 快速登录IRC网络聊天室

    随便起个NickName,进行人机验证,然后点击Connect进去就可以咯.

  5. 利用绝对定位与margin实现元素居中

    例: 要让一个width:100px ; height: 100px;的div,相对body居中. div{ width:100px; height:100px; border: 1px solid ...

  6. SQL SERVER删除列,报错."由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN ... 失败"

    队友给我修改数据的语句.总是执行失败.很纳闷. 如下图: 仔细看了下这个列,并没有什么特殊.如下图: 但其确实有个约束: 'DF__HIS_DRUG___ALL_I__04E4BC85' . 为什么有 ...

  7. 12_CXF入门

    [CXF] Apache CXF = Celtix + Xfire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.Apache CXF 是一个开 ...

  8. position:absolute,绝对定位和相对定位,JQ隐藏和显示

    需要在指定位置,用绝对定位. 如果直接写position:absolute,top:0;left:0,那就是以浏览器的左上角为参照了 现在需要在某一个指定位置用绝对定位 解决方法 在需要用绝对定位(p ...

  9. Jquery Offset, Document, Window 都是什么

    From http://www.cnblogs.com/luhe/archive/2012/11/14/2769263.html   JQuery Offset实验与应用 我们有时候需要实现这样一种功 ...

  10. POJ1182并查集

    食物链 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物, ...