1659: [Usaco2006 Mar]Lights Out 关灯

来源:互联网 发布:java哪些类不能被继承 编辑:程序博客网 时间:2024/05/08 22:00

题目链接

题目大意:给出一个初始01串和一个操作串,每次可以选一个位置l,让初始串从l开始与操作串异或,在最少化1的个数的同时最少化操作次数,输出字典序最大的操作方案

题解:迭代加深搜索,从小到大枚举最终亮着的灯数
剪枝就是迭代加深本身和记录操作数

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int M=55;int n,L;int num,ID;int stk[M],d[M];char S[M],T[M];int dfs(int x,int cnt,int light){    if(cnt>num||light>ID) return 0;    int tmp=0;    if(x>n-L+1)    {        for(int i=x;i<=n;i++) if(S[i]) light++;        if(cnt>num||light>ID) return 0;        for(int i=1;i<=cnt;i++) stk[i]=d[i];        num=cnt;return 1;    }    d[cnt+1]=x;    for(int i=x;i<=x+L-1;i++) S[i]^=T[i-x+1];    tmp|=dfs(x+1,cnt+1,light+S[x]);    d[cnt+1]=0;    for(int i=x;i<=x+L-1;i++) S[i]^=T[i-x+1];    tmp|=dfs(x+1,cnt,light+S[x]);    return tmp;}void work(){    for(num=n,ID=0;ID<=n;ID++)    if(dfs(1,0,0)) break;    printf("%d\n",num);    for(int i=1;i<=num;i++) printf("%d\n",stk[i]);}void init(){    cin>>n>>L;    scanf("%s%s",S+1,T+1);    for(int i=1;i<=n;i++) S[i]-='0';    for(int i=1;i<=L;i++) T[i]-='0';}int main(){    init();    work();    return 0;} 
原创粉丝点击