列表

详情


NC15204. 华尔兹

描述

有一个 n x m 大小的网格,其中有些格点比较特殊,当玩家站在上面的时候会自动移动到相邻四个方向之一,另外一些格点暂时还并不特殊,因为它们的移动方向还未知,如下图:

上图中,第一列和最后一行格点的移动方向未知,其他点的移动方向已经确定了,已经在图中用箭头指出其方向。
现在给定一个起点(上图中的绿色方块)和一个终点(上图中的红色方块),你需要给其中一些移动方向未知的格点确定一个方向,使得玩家能从起点移动到终点。
如下图是一个方案,其中蓝色格点标注出了从起点到终点的路径:

输入描述

对于一个关卡,其对应的文件描述如下。
第一行六个空格隔开的整数 n,m,sx,sy,tx,ty,它们的意义分别如下:
- n 和 m 描述地图的大小,它们分别表示地图的行数、列数。
- sx,sy 分别表示起点的行、列坐标,即起点为第 sx 行第 sy 列的格点。(行、列的编号均从 1 开始)
- tx,ty 分别表示终点的行、列坐标,描述规则同上。
接下来 n 行每行 m 个字符,每个字符表示网格对应位置的状态,不同字符的意义如下:
- w表示向上移动
- s表示向下移动
- a表示向左移动
- d表示向右移动
- .表示方向未确定

输出描述

对于一个关卡,其对应的输出文件为将其输入文件中 . 替换为 w, a, s, d 中任意一个字符的结果,其余内容与格式不变。

示例1

输入:

4 4 1 1 4 4
.aaa
.www
.sss
....

输出:

4 4 1 1 4 4
saaa
swww
dsss
dddw

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 2ms, 内存消耗: 484K, 提交时间: 2020-08-20 09:56:46

# include <bits/stdc++.h>
using namespace std;
int n, m, sx, sy, tx, ty;
char maps[1010][1010];
bool book[1010][1010];
int fx[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
char a[5] = { "dasw" };
int judge(int x, int y)
{
	if (x < 0 || x >= n || y < 0 || y >= m)
		return 0;
	return 1;
}
int flag=0;
void dfs(int x,int y)
{
	if (x == tx && y == ty)
	{
		flag = 1;
		return;
	}
	if(!flag)
	switch (maps[x][y])
	{
	case 'w':
		if (judge(x - 1, y)&&!book[x-1][y])
		{
			book[x - 1][y] = 1;
			dfs(x - 1, y);
		}return;
	case 's':
		if (judge(x + 1, y)&&!book[x+1][y])
		{
			book[x + 1][y] = 1;
			dfs(x + 1, y);
		}return;
	case 'a':
		if (judge(x, y - 1)&&!book[x][y-1])
		{
			book[x][y - 1] = 1;
			dfs(x, y - 1);
		}return;
	case 'd':
		if (judge(x,y+1)&&!book[x][y+1])
		{
			book[x][y + 1] = 1;
			dfs(x,y+1);
		}return;
	case '.':
		int i,nx,ny;
		for (i = 0; i < 4; i++)
		{
			nx = x + fx[i][0];
			ny = y + fx[i][1];
			if (judge(nx, ny) && !book[nx][ny])
			{
				book[nx][ny] = 1;
				maps[x][y] = a[i];
				dfs(nx, ny);
				if (flag)return;
				maps[x][y] = '.';
				book[nx][ny] = 0;
			}
		}
	}
}
int main() {
	scanf("%d %d %d %d %d %d", &n, &m, &sx, &sy, &tx, &ty);
	int i, j;
	for (i = 0; i < n; i++)
		scanf("%s", maps[i]);
	sx--, sy--, tx--, ty--;
	book[sx][sy] = 1;
	dfs(sx, sy);
printf("%d %d %d %d %d %d\n", n,m, sx+1, sy+1, tx+1, ty+1);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (maps[i][j] == '.')
				printf("w");
			else
				printf("%c", maps[i][j]);
		}
		printf("\n");
	}
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 640K, 提交时间: 2023-01-02 11:37:57

#include<iostream>
#include<algorithm>
using namespace std;

int n, m,sx, sy, tx, ty;
const int N = 1e3 + 5;
char d[N][N], f[N][N];
bool st[N][N][5];
int dx[4] = { 0,0,-1,1 };
int dy[4] = { 1,-1,0,0 };
char t[4] = { 'd','a','w','s' };

bool dfs(int x, int y) {
	//printf("f[%d][%d]=%c\n", x, y, f[x][y]);
	if (x == tx && y == ty)return 1;
	if (f[x][y] != '.') {
		for (int i = 0; i < 4; i++) {
			if (f[x][y] == t[i]) {
				if (st[x][y][i])return 0;
				st[x][y][i] = 1;
				int a = dx[i] + x, b=dy[i] + y;
				if (a <= 0 || b <= 0 || a > n || b > m)return 0;
				if (dfs(a, b))return 1;
				break;
			}
		}
	}
	else {
		for (int i = 0; i < 4; i++) {
			if (st[x][y][i])continue;
			st[x][y][i] = 1;
		    f[x][y] = t[i];
			int a = x + dx[i], b = y + dy[i];
			if (a <= 0 || b <= 0 || a > n || b > m)continue;
			if (dfs(a, b))return 1;
		}
		f[x][y] = 'a';
	}
	return 0;
}

int main() {
	cin >> n >> m >> sx >> sy >> tx >> ty;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> d[i][j];
			f[i][j] = d[i][j];
		}
	}
	int num=dfs(sx, sy);
    printf("%d %d %d %d %d %d\n",n,m,sx,sy,tx,ty);
	if (num) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (f[i][j] != '.')cout << f[i][j];
				else cout << 'a';
			}
			puts("");
		}
	}
	return 0;
}

上一题