我发现网上的题解都是dfs,我来个栈的。就是用栈来模拟dfs,也挺简单的,思路很像。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int maxn = 1e5 + 7;
int mp[10][10];
int vis[10][10];
int nextx[4] = {0, 0, 1, -1};
int nexty[4] = {1, -1, 0, 0};
struct node
{
int x, y, z;
};
struct _stack
{
node a[maxn];
int pos;
_stack()
{
pos = -1;
}
void pop()
{
pos--;
}
void push(node x)
{
a[++pos] = x;
}
node top()
{
return a[pos];
}
int siz()
{
return pos + 1;
}
bool empt()
{
if(pos == -1)
return true;
return false;
}
};
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m;
memset(vis, 0, sizeof(vis));
scanf("%d%d", &n, &m);
vis[1][1] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf("%d", &mp[i][j]);
}
}
_stack s;
int ans = 0;
s.push((node){1, 1, 0});
while(!s.empt())
{
node k = s.top();
s.pop();
//printf("%d %d %d\n", k.x, k.y, k.z);
if(k.x == n && k.y == m)
{
ans++;
vis[n][m] = 0;
continue;
}
int flag = 0;
for(int i = k.z; i < 4; i++)
{
k.z++;
int nx = k.x + nextx[i];
int ny = k.y + nexty[i];
if(!vis[nx][ny] && nx >= 1 && ny >= 1 && nx <= n && ny <= m && mp[nx][ny] == 0)
{
s.push((node){k.x, k.y, k.z});
s.push((node){nx, ny, 0});
vis[nx][ny] = 1;
flag = 1;
break;
}
}
if(!flag)
vis[k.x][k.y] = 0;
}
printf("%d\n", ans);
}
return 0;
}