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:枚举第一行,用下一行的翻转改变当前行的值,判断最后一行是否满足条件。0MS。In Reply To:枚举第一行,用下一行的翻转改变当前行的值,判断最后一行是否满足条件。0MS。 Posted by:victor0127 at 2011-10-27 00:48:28 > rt > 枚举第一行(即对第一行的方块进行翻转),16种可能性。 > 翻转第二行的方块,修改对应列的第一行的方块,使得第一行全黑/白。 > 翻转第三行的方块,修改对应列的第二行的方块,使得第二行全黑/白。 > 翻转第四行的方块,修改对应列的第三行的方块,使得第三行全黑/白。 > 最后查看第四行是否满足全黑/白。若不满足,则"Impossible"(只要有一种枚举不满足,其它的枚举也不满足,反之,只要有一种枚举满足,则所有的枚举都满足,因为同一个方块翻转两次,整体不变,猜测所有的可行解都是可以互相转换,并都始于全黑/白,终于全黑/白),否则继续下一次枚举。 > > Source Code > Problem: 1753 User: victor0127 > Memory: 188K Time: 0MS > Language: C++ Result: Accepted > > Source Code > > #include<iostream> > #include<cmath> > #include<string> > #include<cstdio> > using namespace std; > > int square[4][4]; > int flipBit[4][4]; > > void flip(int i, int j) > { > square[i][j]=square[i][j]==1?0:1; > if(i<3) > square[i+1][j]=(square[i+1][j]==1)?0:1; > if(i>0) > square[i-1][j]=(square[i-1][j]==1)?0:1; > if(j<3) > square[i][j+1]=(square[i][j+1]==1)?0:1; > if(j>0) > square[i][j-1]=(square[i][j-1]==1)?0:1; > > } > int main() > { > int min, count,flag,i,j,k,l,m,sum; > string s; > int ts[4][4]; > for(i=0; i<4; i++){ > cin >> s; > for(j=0; j<4; j++){ > if(s.at(j)=='w'){ > square[i][j]=0; > ts[i][j]=0; > } > else{ > square[i][j]=1; > ts[i][j]=1; > } > } > } > > > min=16; > m=0; > for(i=0; i<16; i++){ > j=3; > m=i; > while(m!=0){ > flipBit[0][j]=m%2; > m/=2; > j--; > } > count=0; > flag=0; > for(k=0; k<4; k++){ > if(flipBit[0][k]==1){ > flip(0,k); > count++; > } > flag+=square[0][k]; > } > if(flag>2) > flag=1; //判断翻黑还是翻白这样就可以了么?求原因有没有可能第一行的黑的多 但其他行的黑的少呢 > else > flag=0; > > for(k=0; k<3; k++){ > for(l=0; l<4; l++){ > if(square[k][l]!=flag){ > flip(k+1,l); > count++; > } > } > } > if(count==0){ > cout << 0 << endl; > return 0; > } > if(count<min){ > min=count; > } > sum=0; > for(k=0; k<4; k++){ > sum+=square[3][k]; > } > if(sum!=flag*4){ > cout << "Impossible" << endl; > > return 0; > } > > > for(int p=0; p<4; p++) > for(int q=0; q<4; q++) > square[p][q]=ts[p][q]; > > } > cout << min << 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