求Debug
查看原帖
求Debug
1068608
1111ABC楼主2024/9/4 23:59

这是源代码

#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行“实际路线标记”和“脚印标记”两行输出数据不同。

本蒟蒻恳请各位大佬指出问题并改正。

2024/9/4 23:59
加载中...