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:枚举第一行,用下一行的翻转改变当前行的值,判断最后一行是否满足条件。0MS。

Posted by wucheng_xidian at 2012-08-30 16:56:18 on Problem 1753
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:
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