您的位置:首页 > 其它

poj 1753 2965

2013-03-31 22:21 232 查看
状态压缩+枚举

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <map>
#include <algorithm>
#include <list>
#include <ctime>
#include <set>
#include <queue>

using namespace std;
typedef long long ll;

int relation[4][4];
int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };
void addone(int x, int y, int& res) {
if (x < 0 || x >= 4 || y < 0 || y >= 4) {
return;
}
int offset = x * 4 + y;
res = (res | (1 << offset));

}
int main() {
string data[4];
for (int i = 0; i < 4; i++) {
cin >> data[i];
}
int dp, dpori;
dp = dpori = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (data[i][j] == 'b') {
addone(i, j, dp);
}
}
}
dpori = dp;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
addone(i, j, relation[i][j]);
for (int k = 0; k < 4; k++) {
addone(i + dx[k], j + dy[k], relation[i][j]);
}
}
}
int res = 1000;
int allstate = (1 << 16) - 1;
for (int i = 0; i <= allstate; i++) {
dp = dpori;
int cun = 0;

for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
int tnum = a * 4 + b;
if (i & (1 << tnum)) {
cun++;
dp = dp ^ (relation[a][b]);
}
}
}
if (0 == dp || allstate == dp) {
res = min(res, cun);
}

}
if (1000 == res) {
cout << "Impossible";
return 0;
}
cout << res;
return 0;
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <map>
#include <algorithm>
#include <list>
#include <ctime>
#include <set>
#include <queue>

using namespace std;
typedef long long ll;

int relation[4][4];
int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };
void addone(int x, int y, int& res) {
if (x < 0 || x >= 4 || y < 0 || y >= 4) {
return;
}
int offset = x * 4 + y;
res = (res | (1 << offset));

}
int main() {
string data[4];
/*    string data[4]={"-+--","----","----","-+--"};*/
for (int i = 0; i < 4; i++) {
cin >> data[i];
}
int dp, dpori;
dp = dpori = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (data[i][j] == '+') {
addone(i, j, dp);
}
}
}
dpori = dp;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
addone(i, k, relation[i][j]);
addone(k, j, relation[i][j]);
}
}
}
int res = 1000;
int restag=0;
int allstate = (1 << 16) - 1;
for (int i = 0; i <= allstate; i++) {
dp = dpori;
int cun = 0;

for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
int tnum = a * 4 + b;
if (i & (1 << tnum)) {
cun++;
dp = dp ^ (relation[a][b]);
}
}
}
if (0 == dp ) {
if(res>cun){
res = min(res, cun);
restag=i;
}
}

}
if (1000 == res) {
cout << "Impossible";
return 0;
}
cout << res<<endl;
for(int i=0;i<16;i++){
if(restag&(1<<i)){
int x=i/4;
int y=i%4;
cout<<(x+1)<<" "<<(y+1)<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: