Light OJ 1092 Lighted Panels (状压)

编程入门 行业动态 更新时间:2024-10-26 16:32:04

Light <a href=https://www.elefans.com/category/jswz/34/1768308.html style=OJ 1092 Lighted Panels (状压)"/>

Light OJ 1092 Lighted Panels (状压)

解析:可以参考POJ 3279。不同的是这里要把最上面一行和最左一行一起状压。

[code]:

#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;
const int INF = 0x3f3f3f3f;char mp[10][10];
int n,m,state[10][10],flip[10][10];void init(){int i,j;for(i = 0;i < n;i++){for(j = 0;j < m;j++){state[i][j] = (mp[i][j]=='.');flip[i][j] = 0;}}
}void change(int x,int y){int i,j,xx,yy;for(i = -1;i <= 1;i++){for(j = -1;j <= 1;j++){xx = x+i,yy = y+j;if(xx>=n||xx<0||yy>=m||yy<0) continue;flip[xx][yy] ^= 1;}}
}int calc(){int i,j,res = 0;for(i = 1;i < n;i++){for(j = 1;j < m;j++){if(state[i-1][j-1]^flip[i-1][j-1]){change(i,j);res++;}}}for(j = 0;j < m;j++){if(state[n-1][j]^flip[n-1][j]) return INF;}for(i = 0;i < n;i++){if(state[i][m-1]^flip[i][m-1]) return INF;}return res;
}void sol(){int i,j,S,Ed = 1<<(n+m-1),ans = INF,tmp;for(S = 0;S < Ed;S++){memset(flip,0,sizeof(flip));tmp = 0;for(i = 0;i < n+m-1;i++){if(!(S>>i&1)) continue;tmp++;if(i >= m) change(i-m+1,0);else change(0,i);}ans = min(ans,tmp+calc());}if(ans == INF) puts("impossible");else printf("%d\n",ans);
}int main(){int i,j,cas;scanf("%d",&cas);for(int T=1;T<=cas;T++){scanf("%d%d",&n,&m);for(i = 0;i < n;i++){scanf("%s",mp[i]);}init();printf("Case %d: ",T);sol();}return 0;
}


更多推荐

Light OJ 1092 Lighted Panels (状压)

本文发布于:2024-02-12 15:52:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1688426.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:OJ   Light   状压   Panels   Lighted

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!