爆搜,TLE了(7/10)
考虑一下时间复杂度,每个位置走或者不走,时间复杂度$O(2 ^{N * N})$
#include <iostream>
#include <vector>
using namespace std;
const int N = 21;
typedef pair<int,int> PII;
int n;
int row[N],col[N];
vector<PII> path;
int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};
bool st[N][N];
bool is_first_ans = 1;
void dfs(int x,int y)
{
// 递归对本层的操作
row[x] -- ,col[y] -- ;
st[x][y] = true;
path.push_back({x,y});
if(row[x] < 0 || col[y] < 0) return ;
if(x == n - 1 && y == n - 1)
{
bool f = 1;
for(int i = 0;i < n;i ++ )
if(col[i] != 0 || row[i] != 0)
f = 0;
if(f && is_first_ans)
{
for(auto c : path) cout << c.first * n + c.second<<' ';
is_first_ans = 0; // 只输出一个方案即可,path会输出所有方案
}
return;
}
for(int i = 0;i < 4;i ++ )
{
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= n || st[a][b]) continue;
dfs(a,b);
// 恢复现场,对a,b,不是x,y,因为dfs(a,b)返回的时候,row[a],col[b]值多了1
st[a][b] = false;
path.pop_back();
row[a] ++ ,col[b] ++ ;
}
}
int main()
{
cin >> n;
for(int i =0 ;i < n;i ++ ) cin >> col[i];
for(int i =0 ;i < n;i ++ ) cin >> row[i];
dfs(0,0);
return 0;
}