您的位置:首页 > 其它

POJ 2488 A Knight's Journey

2012-07-22 22:03 246 查看
DFS,要求输出字典序最小的,注意扩展方向。

# include <cstdio>
# include <cstring>

# define N 26 + 5

const int dx[] = {-1, 1,-2, 2,-2, 2,-1, 1};
const int dy[] = {-2,-2,-1,-1, 1, 1, 2, 2};

int p, q, cnt;
bool finished;
char solu
[2];
char vis

;

void dfs(int x, int y)
{
solu[cnt][0] = x, solu[cnt][1] = y;
if (cnt == p*q)
{
finished = true;
return ;
}
else
{
for (int i = 0; i < 8; ++i)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (1<=nx&&nx<=p && 1<=ny&&ny<=q && !vis[nx][ny])
{
vis[nx][ny] = 1, ++cnt;
dfs(nx, ny);
if (finished) return;
vis[nx][ny] = 0, --cnt;
}
}
}

}

void solve(void)
{
finished = false;

for (int i = 1; i <= p; ++i)
memset(vis[i]+1, 0, sizeof(int)*q);

vis[1][1] = 1;
cnt = 1;
dfs(1, 1);
if (finished)
{
printf("A1");
for (int i = 2; i <= p*q; ++i)
printf("%c%c", solu[i][1]-1+'A', solu[i][0]-1+'1');
putchar('\n');
}
else
puts("impossible");
}

int main()
{
int T;

//    freopen("PKU2488.in", "r", stdin);

scanf("%d", &T);
for (int i = 1; i <= T; ++i)
{
if (i > 1) putchar('\n');
printf("Scenario #%d:\n", i);
scanf("%d%d", &p, &q);
solve();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: