lydsy 1085 题目链接:点击打开链接
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int dx[] = {1, 1, -1, -1, 2, 2, -2, -2};
const int dy[] = {2, -2, 2, -2, 1, -1, 1, -1};
const int N = 8;
const int mx = (1<<25)-1;
const int M = 30;
int stpos, st, edpos, ed, zz;
char s[N][N];
int r[M], c[M], id[N][N];
bool f;
void dfs(int cur, int g, int pos, int mxdep) {
if (f)
return ;
if (cur == mxdep) {
if (g == ed && pos == edpos)
f = 1;
} else {
if (__builtin_popcount(g&zz)*2 > mxdep-cur)
return ;
int curx = r[pos], cury = c[pos], nx, ny, ng;
for (int i = 0; i < 8; ++i) {
nx = curx+dx[i];
ny = cury+dy[i];
if (nx>=0&&nx<5&&ny>=0&&ny<5) {
ng = g;
if (ng>>id[nx][ny]&1) {
ng |= 1<<pos;
ng ^= 1<<id[nx][ny];
}
dfs(cur+1, ng, id[nx][ny], mxdep);
}
}
}
}
void work() {
st = 0;
for (int i = 0; i < 5; ++i) {
scanf("%s", s[i]);
for (int j = 0; j < 5; ++j) {
if (s[i][j] == '1')
st |= 1 << id[i][j];
if (s[i][j] == '*')
stpos = id[i][j];
}
}
f = 0;
for (int i = 0; i <= 15; ++i) {
dfs(0, st, stpos, i);
if (f) {
printf("%d\n", i);
return ;
}
}
puts("-1");
}
void prepare() {
int tot = 0;
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j) {
id[i][j] = tot;
r[tot] = i;
c[tot++] = j;
}
ed = 0;
edpos = 12;
ed |= 1<<0; ed |= 1<<1; ed |= 1<<2; ed |= 1<<3; ed |= 1<<4;
ed |= 1<<6; ed |= 1<<7; ed |= 1<<8; ed |= 1<<9;
ed |= 1<<13; ed |= 1<<14;
ed |= 1<<19;
//
zz = 0;
zz |= 1<<5;
zz |= 1<<10; zz |= 1<<11;
zz |= 1<<15; zz |= 1<<16; zz |= 1<<17; zz |= 1<<18;
zz |= 1<<20; zz |= 1<<21; zz |= 1<<22; zz |= 1<<23; zz |= 1<<24;
}
int main() {
prepare();
int cas; scanf("%d", &cas);
while (cas--)
work();
return 0;
}
FZU:
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int dx[] = {1, 1, -1, -1, 2, 2, -2, -2};
const int dy[] = {2, -2, 2, -2, 1, -1, 1, -1};
const int N = 8;
const int mx = (1<<25)-1;
const int M = 30;
int stpos, st, edpos, ed, zz;
char s[N][N];
int r[M], c[M], id[N][N];
bool f;
void dfs(int cur, int g, int pos, int mxdep) {
if (f)
return ;
if (cur == mxdep) {
if (g == ed && pos == edpos)
f = 1;
} else {
if (__builtin_popcount(g&zz)*2 > mxdep-cur)
return ;
int curx = r[pos], cury = c[pos], nx, ny, ng;
for (int i = 0; i < 8; ++i) {
nx = curx+dx[i];
ny = cury+dy[i];
if (nx>=0&&nx<5&&ny>=0&&ny<5) {
ng = g;
if (ng>>id[nx][ny]&1) {
ng |= 1<<pos;
ng ^= 1<<id[nx][ny];
}
dfs(cur+1, ng, id[nx][ny], mxdep);
}
}
}
}
void work() {
st = 0;
for (int i = 0; i < 5; ++i) {
scanf("%s", s[i]);
for (int j = 0; j < 5; ++j) {
if (s[i][j] == '1')
st |= 1 << id[i][j];
if (s[i][j] == '*')
stpos = id[i][j];
}
}
f = 0;
for (int i = 0; i <= 15; ++i) {
dfs(0, st, stpos, i);
if (f) {
printf("%d\n", i);
return ;
}
}
puts("Bored!");
}
void prepare() {
int tot = 0;
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j) {
id[i][j] = tot;
r[tot] = i;
c[tot++] = j;
}
ed = 0;
edpos = 12;
ed |= 1<<0; ed |= 1<<1; ed |= 1<<2; ed |= 1<<3; ed |= 1<<4;
ed |= 1<<6; ed |= 1<<7; ed |= 1<<8; ed |= 1<<9;
ed |= 1<<13; ed |= 1<<14;
ed |= 1<<19;
//
zz = 0;
zz |= 1<<5;
zz |= 1<<10; zz |= 1<<11;
zz |= 1<<15; zz |= 1<<16; zz |= 1<<17; zz |= 1<<18;
zz |= 1<<20; zz |= 1<<21; zz |= 1<<22; zz |= 1<<23; zz |= 1<<24;
}
int main() {
prepare();
int cas; scanf("%d", &cas);
while (cas--)
work();
return 0;
}