2023CCPC网络赛 - E(dfs)

cf传送门

E. Robot Experiment

每次操作,每个位置只有三种情况:可走可不走,必须走,不能走
dfs 每次操作模拟过程统计答案即可,模拟过程类似八皇后问题

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
//#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e5 + 5, inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
int n;
string ss;
map<pii, int> q;
set<pii> ans;

void dfs(int id, int x, int y){
	if(id == n){
		ans.insert({x, y});
		return ;
	}
	int dx = 0, dy = 0;
	if(ss[id] == 'L') -- dx;
	else if(ss[id] == 'R') ++ dx;
	else if(ss[id] == 'U') ++ dy;
	else -- dy;
	if(q[{x + dx, y + dy}] == 0){
		q[{x + dx, y + dy}] = 1;
		dfs(id + 1, x + dx, y + dy);
		q[{x + dx, y + dy}] = -1;
		dfs(id + 1, x, y);
		q[{x + dx, y + dy}] = 0;// 记得清空!!!
	}else if(q[{x + dx, y + dy}] == -1)
		dfs(id + 1, x, y);
	else dfs(id + 1, x + dx, y + dy);
	return ;
}

void solve(){
	cin >> n >> ss;
	q[{0, 0}] = 1;
	dfs(0, 0, 0);
	cout << ans.size() << '\n';
	for(auto [x, y] : ans){
		cout << x << ' ' << y << '\n';
	}
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}
posted @ 2023-10-05 23:40  Qiansui  阅读(437)  评论(0)    收藏  举报