这是源代码
#include<iostream>
#include<cstring>
using namespace std;
const int MAXX=1505;
bool a[MAXX][MAXX], flag, vis[MAXX][MAXX][5];
int n, m, x0, y0;
void init () {
memset (a, 0, sizeof (a));
memset (vis, 0, sizeof (vis));
flag=0;
}
void dfs (int x, int y, int lx, int ly) {
if (flag) return;
if(vis[x][y][0]) {
if (vis[x][y][1]!=lx||vis[x][y][2]!=ly) {
flag=1;
}
return;
}
vis[x][y][0]=1;
vis[x][y][1]=lx;
vis[x][y][2]=ly;
if (!a[(x-1+m)%m][y]) {
dfs ((x-1+m)%m, y, lx-1, ly);
if (flag) return;
}
if (!a[(x+1)%m][y]) {
dfs ((x+1)%m, y, lx+1, ly);
if (flag) return;
}
if (!a[x][(y-1+n)%n]) {
dfs (x, (y-1+n)%n, lx, ly-1);
if (flag) return;
}
if (!a[x][(y+1)%n]) {
dfs (x, (y+1)%n, lx, ly+1);
if (flag) return;
}
return;
}
int main () {
while (cin >> n >> m) {
init ();
for (int i=0; i<n; i++)
for (int j=0; j<m; j++) {
char c;
cin >> c;
if (c=='#') a[j][i]=1;
else if (c=='S') x0=j, y0=i;
}
dfs (x0, y0, x0, y0);
if (flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
交到洛谷上0pts
自己Debug写的一份代码如下:
#include<iostream>
#include<cstring>
using namespace std;
const int MAXX=1505;
bool a[MAXX][MAXX], flag, vis[MAXX][MAXX][3];
int n, m, x0, y0;
void init () {
memset (a, 0, sizeof (a));
memset (vis, 0, sizeof (vis));
flag=0;
}
void dfs (int x, int y, int lx, int ly) {
cout << endl;
cout << "遍历路线" << lx << " " << ly << endl;
cout << "脚印" << vis[x][y][1] << " " << vis[x][y][2] << endl;
if (flag) return;
if(vis[x][y][0]) {
if (vis[x][y][1]!=lx||vis[x][y][2]!=ly) {
cout << "判断" << vis[x][y][1] << " " << lx << " " << vis[x][y][2] << " " << ly << endl;
flag=1;
}
return;
}
vis[x][y][0]=1;
vis[x][y][1]=lx;
vis[x][y][2]=ly;
cout << "实际路线标记" << lx << " " << ly << endl;
cout << "脚印标记" << vis[x][y][1] << " " << vis[x][y][2] << endl;
if (!a[(x-1+m)%m][y]) {
dfs ((x-1+m)%m, y, lx-1, ly);
if (flag) return;
}
if (!a[(x+1)%m][y]) {
dfs ((x+1)%m, y, lx+1, ly);
if (flag) return;
}
if (!a[x][(y-1+n)%n]) {
dfs (x, (y-1+n)%n, lx, ly-1);
if (flag) return;
}
if (!a[x][(y+1)%n]) {
dfs (x, (y+1)%n, lx, ly+1);
if (flag) return;
}
return;
}
int main () {
while (cin >> n >> m) {
init ();
for (int i=0; i<n; i++)
for (int j=0; j<m; j++) {
char c;
cin >> c;
if (c=='#') a[j][i]=1;
else if (c=='S') x0=j, y0=i;
}
dfs (x0, y0, x0, y0);
if (flag) cout << "Yes" << endl;
else cout << "No" << endl;
cout << endl << endl;
}
return 0;
}
在这份代码第25、26行把lx, ly分别赋给了vis[x][y][1]和vis[x][y][2]。那么第27、28行输出数据理应相同。 然而样例的输出是这样的:
5 4
##.#
##S#
#..#
#.##
#..#
遍历路线2 1
脚印0 0
实际路线标记2 1
脚印标记1 1
遍历路线2 0
脚印0 0
实际路线标记2 0
脚印标记1 0
遍历路线2 -1
脚印0 0
实际路线标记2 -1
脚印标记1 1
遍历路线1 -1
脚印0 0
实际路线标记1 -1
脚印标记1 1
遍历路线2 -1
脚印1 1
判断1 2 1 -1
Yes
5 4
##.#
##S#
#..#
..#.
#.##
遍历路线2 1
脚印0 0
实际路线标记2 1
脚印标记1 1
遍历路线2 0
脚印0 0
实际路线标记2 0
脚印标记1 0
遍历路线2 1
脚印1 1
判断1 2 1 1
Yes
发现第27、28行“实际路线标记”和“脚印标记”两行输出数据不同。
本蒟蒻恳请各位大佬指出问题并改正。