| ||||||||||
| 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