| ||||||||||
| 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 | |||||||||
很无奈,为什么我用最苯的穷举法都过不了 过了的帮忙看下吧#include<iostream>
#include<cmath>
#include<bitset>
using namespace std;
#define N 4
int minCount = 100000;
int map[N][N];
int oldarr[N][N];
bool isFinish();
void output(int mapp[N][N]){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
cout<<mapp[i][j];
}
cout<<endl;
}
}
void roll(int i){//i的范围0-15,转化为MAP中的位置
int column,row,pianyi_x,pianyi_y;
column = i % N;
row = i / N;
pianyi_x = row;
pianyi_y = column ;
if(pianyi_x>=0 && pianyi_x<N && pianyi_y>=0 && pianyi_y<N){
map[pianyi_x][pianyi_y] = ~map[pianyi_x][pianyi_y]; //求反
}
pianyi_x = row - 1;
pianyi_y = column ;
if(pianyi_x>=0 && pianyi_x<N && pianyi_y>=0 && pianyi_y<N){
map[pianyi_x][pianyi_y] = ~map[pianyi_x][pianyi_y];
}
pianyi_x = row + 1;
pianyi_y = column;
if(pianyi_x>=0 && pianyi_x<N && pianyi_y>=0 && pianyi_y<N){
map[pianyi_x][pianyi_y] = ~map[pianyi_x][pianyi_y];
}
pianyi_x = row ;
pianyi_y = column - 1;
if(pianyi_x>=0 && pianyi_x<N && pianyi_y>=0 && pianyi_y<N){
map[pianyi_x][pianyi_y] = ~map[pianyi_x][pianyi_y];
}
pianyi_x = row ;
pianyi_y = column + 1;
if(pianyi_x>=0 && pianyi_x<N && pianyi_y>=0 && pianyi_y<N){
map[pianyi_x][pianyi_y] = ~map[pianyi_x][pianyi_y];
}
}
bool isFinish(){ //判断是否已经成功
int i,j;
for(i=0; i<N; ++i){
for(j=0; j<N; ++j){
if( map[i][j]==0 ) return false;
}
}
return true;
}
void work(){
int i,cnt,k,jin;
bitset<16> bs(0);
while(bs!=65535){
if(bs[0]==0) bs[0]=~bs[0]; //BS=BS+1,穷举1-65535的状态
else{
k=0;
bs[k] = 0;
jin = 1;
while(jin==1){
if(bs[++k]==1){
bs[k] = 0;
}else{
bs[k] = 1;
jin = 0;
}
}
}
memcpy(map,oldarr,16);
for(i=0; i<bs.size();i++){
if(bs[i]==1) roll(i); //如果这一位是1,就转换
}
if(isFinish()==true){
cnt = (int) bs.count(); //有多少位是1,就转换了多少次
if(cnt< minCount) minCount = cnt;
}
}
}
int main()
{
int i,j;
char aChar;
for(i = 0;i < N ; i++ ){
for(j = 0 ; j < N ; j++){
cin>>aChar;
if( aChar=='b'){
oldarr[i][j] = -1;
}
else {
oldarr[i][j] = 0;
}
}
}
memcpy(map,oldarr,16);
if( isFinish()== true)
cout<<0<<endl;
else{
work();
if(minCount!=100000) cout<<minCount<<endl;
else cout<<"Impossible"<<endl;
}
system("pause");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator