usaco2.24Party Lamps

亂七八糟的寫 改着改着就這麼過了。。dfs枚舉 可以看出每個串前六位跟後面的都是一樣的 比較不同也就看前6位就可以了

/*
    ID: your_id_here
    PROG: lamps
    LANG: C++
*/
#include <iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
int f[10],n,c,on[110],of[110],g1,g2;
char str[110],ss[110],si[1000][10],w;
int Comp(const void *p1,const void *p2)
{
   return strcmp((char *)p1,(char *)p2);
}
int judge(char *sw)
{
    int i;
    for(i = 1 ; i <= g1 ; i++)
    {
        if(sw[(on[i]-1+6)%6]=='0')
        return 0;
    }
     for(i = 1 ; i <= g2 ; i++)
    {
        if(sw[(of[i]-1+6)%6]=='1')
           return 0;
    }
    return 1;
}
void dfs(int x,int k)
{
    int i,j,ff =0;
    char sj[110];
    switch(x)
    {
        case 1:
        for(i = 0 ; i < 6 ; i++)
        if(str[i]=='0')
           str[i] = '1';
        else
           str[i] = '0';break;
        case 2:
        for(i = 0 ; i < 6 ; i++)
        {
            if((i+1)%2!=0)
            {
                 if(str[i]=='0')
                 str[i] = '1';
                 else
                 str[i] = '0';
            }
        }
        break;
        case 3:
        for(i = 0 ; i < 6 ; i++)
        {
            if((i+1)%2==0)
            {
                 if(str[i]=='0')
                 str[i] = '1';
                 else
                 str[i] = '0';
            }
        }
        break;
        case 4:
        for(i = 0 ; i < 6 ; i++)
        {
            if(((i+1)-1)%3==0)
            {
                 if(str[i]=='0')
                 str[i] = '1';
                 else
                 str[i] = '0';
            }
        }
        break;
    }
    if(k==c)
    {

        for(i = 0 ; i < w ; i++)
        {
            if(strcmp(str,si[i])==0)
                return ;
        }
        if(!judge(str))
        return ;
        strcpy(si[w],str);
        w++;
        return ;
    }
    for(j = 0 ; j < 6 ;j++)
       sj[j] = str[j];
    for(i = 1; i <= 4 ; i++)
    {
        for(j = 0 ; j < 6 ;j++)
        str[j] = sj[j];
        f[i] =1 ;
        dfs(i,k+1);
    }
}
int main()
{
    freopen("lamps.in","r",stdin);
    freopen("lamps.out","w",stdout);
    int i,j,k,x;
    cin>>n>>c;
    while(cin>>x)
    {
        if(x==-1)
            break;
        g1++;
        on[g1] = x;
    }
    while(cin>>x)
    {
        if(x==-1)
            break;
        g2++;
        of[g2] = x;
    }
    for(i = 0 ; i < n ; i++)
        ss[i] = '1';
    if(c==0)
    {
        if(judge(ss))
        puts(ss);
        else
        puts("IMPOSSIBLE");
        return 0;
    }
    if(c>4)
    c = 4;
    for(i = 1; i <= 4 ; i++)
    {
        for(j = 0 ; j < 6 ;j++)
            str[j] = ss[j];
        dfs(i,1);
    }
    if(w==0)
    {
         puts("IMPOSSIBLE");
         return 0;
    }
    qsort(si,w,sizeof(si[0]),Comp);
    for(i = 0 ; i < w  ; i++)
    {
        for(j = 1 ; j <= n/6 ; j++)
            cout<<si[i];
        for(j = 1 ; j <= n%6 ; j++)
            cout<<si[i][j-1];
        puts("");
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章