天天看點

1753 Flip Game

和咱天的HDU 1882 Strange Billboard 差不多

不過這題的資料量要小一些,4*4的規模,用二進制表示完全可以用INT型存

http://acm.pku.edu.cn/JudgeOnline/problem?id=1753

#include <iostream>

#include <cstring>

using namespace std;

char g[4][4];

int counter;

int temp1,temp2;

int start;

int find(int x);

int d[4] =

{

0xf000,

0x0f00,

0x00f0,

0x000f

};

int main()

{

int i,j,k,m,n,t;

while (scanf("%s",g[0])!=EOF)

{

start = 0; //記錄開始的狀态

for (i=0;i<4;i++) //轉換前四位15~12

{

if (g[0][i] == 'b') // 如果是黑色的

{

start = start | (1<<(15-i));

}

}

k = 11;

for (i=1;i<=3;i++) //輸入及轉換後12位:11~0

{

scanf("%s",g[i]);

}

for (i=1;i<=3;i++) //輸入及轉換後12位:11~0

{

for (j=0;j<4;j++)

{

if (g[i][j] == 'b') // 如果是黑色的

{

start = start | (1<<(k));

}

k--;

}

}

// printf("%d/n",start);

//輸入及轉換完成-----------------------------------

int mincount=-1;

for (i=0;i<16;i++)

{

//printf("%d/n",counter);

//i+((1<<12)-1)

if (find(i)) //如果可以達到目标态

{

if ((counter < mincount) || (mincount == -1))

{

mincount = counter;

}

}

}

if (mincount == -1) //如果一直不可達

{

//那麼

printf("Impossible/n");

}

else

{

printf("%d/n",mincount);

}

}

return 0;

}

int find (int x) //參數傳第一行的轉換方法

{

int i,j,change1 = 0,change2 = 0,counter1 = 0,counter2 = 0;

temp1 = start;

temp2 = ~start;

for (i=0;i<4;i++) //change each line

{

if (i == 0) //第一行的轉換

{

change1 = (x<<12);

change2 = (x<<12);

}

else

{

change1 = temp1&(d[i-1]);//上一行的位情況

change2 = temp2&(d[i-1]);

temp1 = temp1 & (~d[i-1]);

temp2 = temp2 & (~d[i-1]);

}

//然後開使轉化

if (i)

{

temp1 ^= change1>>4;

temp1 ^= (change1>>(4+1))&d[i];

temp1 ^= (change1>>(4-1))&d[i];

temp1 ^= (change1>>(4+4))&d[i+1];

temp2 ^= change2>>4;

temp2 ^= (change2>>(4+1))&d[i];

temp2 ^= (change2>>(4-1))&d[i];

temp2 ^= (change2>>(4+4))&d[i+1];

}

else

{

temp1 ^= change1;

temp1 ^= (change1>>1)&d[i];

temp1 ^= (change1<<1)&d[i];

temp1 ^= (change1>>4)&d[i+1];

temp2 ^= change2;

temp2 ^= (change2>>1)&d[i];

temp2 ^= (change2<<1)&d[i];

temp2 ^= (change2>>4)&d[i+1];

}

//計算counter of change

for (j=0;j<16;j++)

{

if ((change1>>j)&1)

{

counter1++;

}

if ((change2>>j)&1)

{

counter2++;

}

}

}

if (temp1 && temp2 != 0xffff)

{

return 0;

}

else

{

if (!(temp1 && temp2 != 0xffff))

{

counter = counter1<counter2?counter1:counter2;

}

else if (!temp1)

{

counter = counter1;

}

else

counter = counter2;

return 1;

}

}

/*

test data:

wbbw

wwbw

wbbw

wbbb

bwwb

bbwb

bwwb

bwww

bbbb

bbbb

bbbb

bbbb

wwww

wwww

wwww

wwww

*/

繼續閱讀