Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:仅对第一行进行枚举

Posted by jean5601 at 2010-05-14 20:12:13 on Problem 1753
In Reply To:仅对第一行进行枚举 Posted by:silko at 2009-12-01 13:14:26
> 只需对第一行进行枚举,第i行如何改变取决于第i-1行的值。只需枚举16次便可完成
确实是这样的,大概枚举16次就OK了。轻松AC。
#include <iostream>
#include <string>
using namespace std;

void setflip(string &s,int col)
{
     switch(col)
     {
         case 1:
              s[1]='b'+'b'-s[1];s[2]='b'+'b'-s[2];s[5]='b'+'b'-s[5];
              break;
         case 2:
              s[1]='b'+'b'-s[1];s[2]='b'+'b'-s[2];s[3]='b'+'b'-s[3];s[6]='b'+'b'-s[6];
              break;
         case 3:
              s[2]='b'+'b'-s[2];s[3]='b'+'b'-s[3];s[4]='b'+'b'-s[4];s[7]='b'+'b'-s[7];
              break;
         case 4:
              s[3]='b'+'b'-s[3];s[4]='b'+'b'-s[4];s[8]='b'+'b'-s[8];
              break;
         case 5:
              s[1]='b'+'b'-s[1];s[5]='b'+'b'-s[5];s[6]='b'+'b'-s[6];s[9]='b'+'b'-s[9];
              break;
         case 6:
              s[2]='b'+'b'-s[2];s[5]='b'+'b'-s[5];s[6]='b'+'b'-s[6];s[7]='b'+'b'-s[7];s[10]='b'+'b'-s[10];
              break;
         case 7:
              s[3]='b'+'b'-s[3];s[6]='b'+'b'-s[6];s[7]='b'+'b'-s[7];s[8]='b'+'b'-s[8];s[11]='b'+'b'-s[11];
              break;
         case 8:
              s[4]='b'+'b'-s[4];s[7]='b'+'b'-s[7];s[8]='b'+'b'-s[8];s[12]='b'+'b'-s[12];
              break;
         case 9:
              s[5]='b'+'b'-s[5];s[9]='b'+'b'-s[9];s[10]='b'+'b'-s[10];s[13]='b'+'b'-s[13];
              break;
         case 10:
              s[6]='b'+'b'-s[6];s[9]='b'+'b'-s[9];s[10]='b'+'b'-s[10];s[11]='b'+'b'-s[11];s[14]='b'+'b'-s[14];
              break;
         case 11:
              s[7]='b'+'b'-s[7];s[10]='b'+'b'-s[10];s[11]='b'+'b'-s[11];s[12]='b'+'b'-s[12];s[15]='b'+'b'-s[15];
              break;
         case 12:
              s[8]='b'+'b'-s[8];s[11]='b'+'b'-s[11];s[12]='b'+'b'-s[12];s[16]='b'+'b'-s[16];
              break;
         case 13:
              s[9]='b'+'b'-s[9];s[13]='b'+'b'-s[13];s[14]='b'+'b'-s[14];
              break;
         case 14:
              s[10]='b'+'b'-s[10];s[13]='b'+'b'-s[13];s[14]='b'+'b'-s[14];s[15]='b'+'b'-s[15];
              break;
         case 15:
              s[11]='b'+'b'-s[11];s[14]='b'+'b'-s[14];s[15]='b'+'b'-s[15];s[16]='b'+'b'-s[16];
              break;
         case 16:
              s[12]='b'+'b'-s[12];s[15]='b'+'b'-s[15];s[16]='b'+'b'-s[16];
              break;
         default:
              break;
     }
}

int main()
{
    int i,j,counter,counter_first,min_counter=17;
    int one,two,three,four,num;
    bool flag;
    string source,str,str_copy;
    source="b";
    cin>>str;
    source+=str;
    cin>>str;
    source+=str;
    cin>>str;
    source+=str;
    cin>>str;
    source+=str;
    for(i=1;i<=16;i++)
    {
        if(source[i] == 'b')
            source[i]= 'a';
        else
            source[i]= 'c';
    }
    for(i=0;i<=15;i++)
    {
        num=i;counter=0;counter_first=0;
        four=num%2;num/=2;
        three=num%2;num/=2;
        two=num%2;num/=2;
        one=num%2;
        str=source;
        if(one)
        {
            setflip(str,1);
            counter_first++;
        }
        if(two)
        {
            setflip(str,2);
            counter_first++;
        }
        if(three)
        {
            setflip(str,3);
            counter_first++;
        }
        if(four)
        {
            setflip(str,4);
            counter_first++;
        }
        str_copy=str;
        counter=counter_first;
        for(j=1;j<=12;j++)
            if(str[j]!= 'a')
            {
                setflip(str,j+4);
                counter++;
            }
        flag=true;
        for(j=13;j<=16;j++)
            if(str[j] != 'a')
                flag=false;
        if(flag)
            if(counter < min_counter)
                min_counter=counter;
        counter=counter_first;
        for(j=1;j<=12;j++)
            if(str_copy[j] != 'c')
            {
                setflip(str_copy,j+4);
                counter++;
            }
        flag=true;
        for(j=13;j<=16;j++)
            if(str_copy[j] != 'c')
                flag=false;
        if(flag)
            if(counter < min_counter)
                min_counter=counter;
    }
    if(min_counter < 17)
        cout<<min_counter<<endl;
    else
        cout<<"Impossible"<<endl;
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator