思路在注释中,不要划走,请求大佬指点,谢谢
#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