1,3WA,其他RE,#1自己测试输出正确(文末附#1测试点
查看原帖
1,3WA,其他RE,#1自己测试输出正确(文末附#1测试点
1288168
silver_rain楼主2024/5/9 20:58

思路在注释中,不要划走,请求大佬指点,谢谢

#include<iostream>

using namespace std;

char maze[1505][1505];
int row, col;
void isConnected();
bool ans[10];
int ans_index = 0;
bool canTo(int r, int c);
int nowr, nowc;
int flag_maze[1505][1505];
int dr[4] = {0, 0, 1, -1};
int dc[4] = {1, -1, 0, 0};
int main()
{
	while(true)
	{
		string line;
		getline(cin, line);
		if(line.empty()) break;
		int i = 0, j;
		row = 0, col = 0;
		while(line[i] != ' ')
		{
			row = row * 10 + (line[i] - '0');
			i++;
		}
		i++;
		while(i < line.length())
		{
			col = col * 10 + (line[i] - '0');
			i++;
		}
//		cout << endl << row << " " << col << endl;
		for(i = 0; i < row; i++)
		{
			for(j = 0; j < col; j++)
			{
				cin >> maze[i][j];
				if(maze[i][j] == 'S')
				{
					nowr = i, nowc = j;
				}
			}
		}
		cin.ignore();//忽略当前行的换行符
		isConnected();
	}
	for(int i = 0; i < ans_index; i++)
	{
		if(ans[i] == true)
		{
			cout << "Yes" << endl;
		}
		else cout << "No" << endl;
	}
} 
//上下重复一次,如果能走到有连通的地方,那么就可以
//不行的话左右重复一次
//都走不到连通的地方,那就不行
//如何定义“连通”:最后一排和第一排有上下连续的'.'
//最后一列和第一列有左右连续的'.'
void isConnected()
{
	int i;
	for(i = 0; i < col; i++)
	{
		if((maze[0][i] == '.' || maze[0][i] == 'S') && (maze[row - 1][i] == '.' || maze[row - 1][i] == 'S'))
		{
			if(canTo(0, i) && canTo(row - 1, i))
			{
				ans[ans_index] = true;
				ans_index++;
				return;
			}
		}
	}
	for(i = 0; i < row; i++)
	{
		if((maze[i][0] == '.' || maze[i][0] == 'S') && (maze[i][col - 1] == '.' || maze[i][col - 1] == 'S'))
		{
			if(canTo(i, 0) && canTo(i, col - 1))
			{
				ans[ans_index] = true;
				ans_index++;
				return;
			}
		}
	}
	ans[ans_index] = false;
	ans_index++;
	return;
}

void bfs(int r, int c, int fin_r, int fin_c)
{
	if(r == fin_r && c == fin_c) return;
	for(int i = 0; i < 4; i++)
	{
		int new_r = r + dr[i];
		int new_c = c + dc[i];
		if(new_r >= 0 && new_r < row && new_c >= 0 && new_c < col && maze[new_r][new_c] == '.' && flag_maze[new_r][new_c] == 0)
		{
			flag_maze[new_r][new_c] = 1;
			bfs(new_r, new_c, fin_r, fin_c);
		}
		if(flag_maze[fin_r][fin_c] == 1) return;
	}
}

bool canTo(int r, int c)
{
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < col; j++)
		{
			flag_maze[i][j] = 0;
		}
	}
	flag_maze[nowr][nowc] = 1;
	bfs(nowr, nowc, r, c);
	if(flag_maze[r][c] == 1) return true;
	else return false;
}

//#1:
//6 9
//#.#.#.#.#
//S.#.#.#.#
//###.#.###
//#...#...#
//#.#####.#
//#.#...#.#
//1 1
//S
//5 5
//#.#.#
//..#..
//#####
//.S#..
//#.#.#

//answer:
//No
//Yes
//No
2024/5/9 20:58
加载中...