| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:仅对第一行进行枚举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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator