思路:直接DFS去搜索了,加了些剪枝,还是过不了TLE了,答案跑起来感觉挺快的。有谁过了的求交流
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <map>
#include <set>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int d[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
using namespace std;
int t, vis[12], x, y, g[8][8];
typedef pair<int, int> pi;
pi fz(pi p) {
return make_pair(-p.first, p.second);
}
pi xz(pi p) {
return make_pair(-p.second, p.first);
}
struct Puz {
int v[8][5][2];
int vn;
Puz() {}
Puz(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int x5, int y5) {
vn = 0; int i, j, k, l;
pi save[5];
set<pi> s;
save[0] = make_pair(x1, y1);
save[1] = make_pair(x2, y2);
save[2] = make_pair(x3, y3);
save[3] = make_pair(x4, y4);
save[4] = make_pair(x5, y5);
set<set<pi> > ss;
for (i = 0; i < 2; i++) {
for (j = 0; j < 4; j++) {
s.clear();
for (k = 0; k < 5; k++)
s.insert(save[k]);
if (ss.find(s) == ss.end()) {
int S = 100, B = 100;
for (k = 0; k < 5; k++) {
S = min(S, save[k].first);
}
for (k = 0; k < 5; k++) {
v[vn][k][0] = save[k].first - S;
}
for (k = 0; k < 5; k++) {
if (save[k].first - S== 0) {
B = min(B, save[k].second);
}
}
for (k = 0; k < 5; k++)
v[vn][k][1] = save[k].second - B;
vn++;
ss.insert(s);
}
for (k = 0; k < 5; k++) {
save[k] = xz(save[k]);
}
}
for (j = 0; j < 5; j++) {
save[j] = fz(save[j]);
}
}
}
} p[12];
void init() {
p[0] = Puz(0, -2, 0, -1, 0, 0, 0, 1, 0, 2);
p[7] = Puz(0, -2, 0, -1, 0, 0, 0, 1, 1, 1);
p[11] = Puz(0, -2, 0, -1, 0, 0, 1, 0, 0, 1);
p[6] = Puz(0, 0, 0, 1, 0, 2, 1, 0, 1, 1);
p[4] = Puz(0, -1, 0, 0, 0, 1, 1, 1, 2, 1);
p[9] = Puz(0, -1, 0, 0, 0, 1, 1, 0, 2, 0);
p[2] = Puz(0, -1, 0, 0, 0, 1, 1, -1, 1, 1);
p[1] = Puz(0, 0, -1, 0, 1, 0, 0, -1, 0, 1);
p[3] = Puz(0, 0, 0, -1, 0, 1, -1, -1, 1, 1);
p[5] = Puz(0, 0, 0, -1, 0, 1, -1, -1, 1, 0);
p[10] = Puz(0, 0, -1, 0, -2, 0, 0, 1, 1, 1);
p[8] = Puz(0, 0, 0, -1, -1, -1, 1, 0, 1, 1);
}
inline bool judge(int a, int b, int x, int y) {
for (int i = 0; i < 5; i++) {
int xx = x + p[a].v[b][i][0];
int yy = y + p[a].v[b][i][1];
if (xx < 0 || xx >= 8 || yy < 0 || yy >= 8 || g[xx][yy] != -1) return false;
}
return true;
}
int vv[8][8];
int df(int x, int y) {
if (x < 0 || x >= 8 || y < 0 || y >= 8 || vv[x][y] || g[x][y] != -1) return 0;
vv[x][y] = 1;
int ans = 1;
for (int i = 0; i < 4; i++) {
ans += df(x + d[i][0], y + d[i][1]);
}
return ans;
}
inline bool ju(int x, int y) {
memset(vv, 0, sizeof(vv));
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (g[i][j] == -1) {
if (x > i) return false;
if (vv[i][j]) continue;
if (df(i, j) % 5 != 0) return false;
}
}
}
return true;
}
bool dfs(int x, int y, int num) {
if (!ju(x, y)) return false;
if (num == 60) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (g[i][j] == 100) printf("*");
else printf("%c", g[i][j] + ‘a‘);
}
printf("\n");
}
return true;
}
if (x == 8) return false;
if (y == 8) return dfs(x + 1, 0, num);
if (g[x][y] != -1) return dfs(x, y + 1, num);
for (int i = 0; i < 12; i++) {
if (vis[i]) continue;
vis[i] = 1;
for (int j = 0; j < p[i].vn; j++) {
int k;
if (!judge(i, j, x, y)) continue;
for (k = 0; k < 5; k++) {
int xx = x + p[i].v[j][k][0];
int yy = y + p[i].v[j][k][1];
g[xx][yy] = i;
}
if (dfs(x, y + 1, num + 5)) return true;
for (k = 0; k < 5; k++) {
int xx = x + p[i].v[j][k][0];
int yy = y + p[i].v[j][k][1];
g[xx][yy] = -1;
}
}
vis[i] = 0;
}
if (dfs(x, y + 1, num)) return true;
return false;
}
int main() {
init();
scanf("%d", &t);
while (t--) {
int flag = 0;
memset(g, -1, sizeof(g));
memset(vis, 0, sizeof(vis));
for (int i = 0; i < 4; i++) {
scanf("%d%d", &x, &y);
if (x < 1 || x > 8 || y < 1 || y > 8)
flag = 1;
g[x - 1][y - 1] = 100;
}
if (flag || !dfs(0, 0, 0)) printf("No solution.\n");
if (t) printf("\n");
}
return 0;
}UVA 764 Pentominos(搜索)(未AC),布布扣,bubuko.com
原文:http://blog.csdn.net/accelerator_/article/details/22983257