JGShining | We have carefully selected several similar problems for you: 1016 1241 1242 1072 1312
AC(1)
#include
#include
#include
#include
#define N 1005
using namespace std;
int c, r, arrtime;
int sx, sy, ex, ey;
int x;
int flag; int to[4][2] = { { 0,-1 },{ 0,1 },{ -1,0 },{ 1,0 } };
struct
{
char ch;
}maze[N][N];
void dfs(int x, int y, int time)
{
if (flag) return;
if (x <= 0 || x>r || y <= 0 || y>c) return;
int ans;
ans = arrtime - time - abs(ex - x) - abs(ey - y);
if (ans & 1 || ans < 0) return;
if (x == ex&&y == ey&&time == arrtime) {
flag = 1; return;
}
for (int i = 0; i<4; i++)
{
if (maze[x + to[i][0]][y + to[i][1]].ch != 'X')
{
maze[x + to[i][0]][y + to[i][1]].ch = 'X';//走过的地方变为墙
dfs(x + to[i][0], y + to[i][1], time + 1);
maze[x + to[i][0]][y + to[i][1]].ch = '.';//迷宫还原,以便下次广搜
}
}
}
int main(void)
{
while (cin >> r >> c >> arrtime)
{
if (c == 0 && r == 0 && arrtime == 0)
break;
else
{
x = 0;
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
cin >> maze[i][j].ch;
if (maze[i][j].ch == 'S')
{
sx = i;
sy = j;
}
if (maze[i][j].ch == 'X')
{
x++;
}
if (maze[i][j].ch == 'D')
{
ex = i;
ey = j;
}
}
getchar();
}
if (r*c - x <= arrtime) { cout << "NO" << endl; }
else
{
flag = 0;
maze[sx][sy].ch = 'X';
dfs(sx, sy, 0);
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
}
}
AC(2)
#include
#include
#include
#include
#define N 1005
using namespace std;
int c, r, arrtime;
int sx, sy, ex, ey;
int x;
int flag;
struct
{
char ch;
}maze[N][N];
void dfs(int x, int y, int time)
{
if (flag) return;
if (maze[x][y].ch == '.' || maze[x][y].ch == 'S')
maze[x][y].ch = 'X';
if (x == ex&&y == ey&&time == arrtime) {
flag = 1; return;
}
if (x <= 0 || x>r || y <= 0 || y>c) return;
int ans;
ans = arrtime - time - abs(ex - x) - abs(ey - y);
if (ans & 1 || ans < 0) return;
if (maze[x - 1][y].ch != 'X')
{
maze[x - 1][y].ch == 'X';
dfs(x - 1, y, time + 1);
maze[x - 1][y].ch = '.';
}
if (maze[x + 1][y].ch != 'X')
{
maze[x + 1][y].ch == 'X';
dfs(x + 1, y, time + 1);
maze[x +1][y].ch = '.';
}
if (maze[x ][y-1].ch != 'X')
{
maze[x ][y-1].ch == 'X';
dfs(x , y-1, time + 1);
maze[x][y-1].ch = '.';
}
if (maze[x][y +1].ch != 'X')
{
maze[x][y + 1].ch == 'X';
dfs(x, y + 1, time + 1);
maze[x][y + 1].ch = '.';
}
return;
}
int main(void)
{
while (cin >> r >> c >> arrtime)
{
if (c == 0 && r == 0 && arrtime == 0)
break;
else
{
x = 0;
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
cin >> maze[i][j].ch;
if (maze[i][j].ch == 'S')
{
sx = i;
sy = j;
}
if (maze[i][j].ch == 'X')
{
x++;
}
if (maze[i][j].ch == 'D')
{
ex = i;
ey = j;
}
}
getchar();
}
if (r*c - x <= arrtime) { cout << "NO" << endl; }
else
{
flag = 0;
dfs(sx, sy, 0);
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
}
}
t-[abs(ex-sx)+abs(ey-sy)] //若此算式结果为非偶数,则无法恰好在T步内达到
算法优化要点奇偶剪枝法