​传送门​​​ 思路:dfs探路即可,注意判断邻界条件,记得多考虑几种情况。
同时不能忽视题目条件。(空白处用’ '补齐)。

#include<algorithm>
#include<map>
#include<cstring>
#include<iostream>
using namespace std;
char a[500][500];
int n, flag = 0;
void dfs(int x, int y, char fx)
{
if(flag)
{
return ;
}
//cout << x << " " << y << " " << a[x][y] << endl;
if(fx == 'r')
{
//cout << 1 << endl;///当前方向和下一个方向

if(a[x][y + 2] == '#' && a[x + 2][y] == '#')
{
flag = 1;
return ;
}
if(y + 1 >= n || a[x][y + 2] == '#')
{
a[x + 1][y] = '#';
dfs(x + 1, y, 'd');
}
else
{
a[x][y + 1] = '#';
dfs(x, y + 1, fx);
}
}
else if(fx == 'd')
{
//cout << 2 << endl;
if((a[x][y - 2] == '#' || a[x - 1][y - 1] == '#' ) && a[x + 2][y] == '#')
{
flag = 1;
return ;
}
if(x + 1 >= n || a[x + 2][y] == '#')
{
a[x][y - 1] = '#';
dfs(x, y - 1, 'l');
}
else
{
a[x + 1][y] = '#';
//cout << 1111 << endl;
dfs(x + 1, y, fx);
}
}
else if(fx == 'l')
{
//cout << 3 << endl;
//a[x][y] = '#';
if(a[x][y - 2] == '#' && a[x - 2][y] == '#')
{
flag = 1;
return ;
}
if(y - 1 < 0 || a[x][y - 2] == '#')
{
a[x - 1][y] = '#';
dfs(x - 1, y, 'u');
}
else
{
a[x][y - 1] = '#';
dfs(x, y - 1, fx);
}
}
else if(fx == 'u')
{
//cout << 4 << endl;
//a[x][y] = '#';
if((a[x][y + 2] == '#' || a[x + 1][y + 1] == '#' ) && a[x - 2][y] == '#')
{
flag = 1;
return ;
}
//if(a[x][y - 2] == '#' && )
if(x - 1 < 0 || a[x - 2][y] == '#')
{
a[x][y + 1] = '#';
dfs(x, y + 1, 'r');
}
else
{
a[x - 1][y] = '#';
dfs(x - 1, y, fx);
}
}
}
int main()
{
int T;
cin >> T;
while(T--)
{
flag = 0;
memset(a,' ',sizeof a);
cin >> n;
a[0][0] = '#';
if(n == 1)
cout << "#" << endl;
else if(n == 2)
{
cout << "##" << endl;
cout << " #" << endl;
}
else if(n == 3)
{
cout << "###" << endl;
cout << " #" << endl;
cout << "###" << endl;
}
else
{
dfs(0, 0, 'r');
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
cout << a[i][j];
cout << endl;
}
}
}
return 0;
}