UVA225 Golygons 黄金图形(dfs+回溯)
2024-08-23 07:19:05
剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点。
剪枝2:当前位置怎么也走不回去。
3:沿途判断障碍即可。
在oj上提交0.347s,最快的0.012s,应该有更好的做法。
#include<bits/stdc++.h> const char *bin = "ensw";
const int dx[] = {,, ,-};
const int dy[] = {,,-, }; const int maxn = ;//1+...20
const int o = ;
const int N = ;
const int nxt_dir[][] = {{,},{,},{,},{,},{,,,}};
const int deg[] = {,,,,};
int vis[maxn][maxn];
int n;
int sum[N];
int left[N];
int path[N];
int cnt;
void dfs(int x,int y,int d,int dir)
{
if(d++ == n ){
if(x == o && y == o){
for(int i = ; i < n; i++){
printf("%c",bin[path[i]]);
}
putchar('\n');
cnt++;
}
return ;
}
for(int i = ; i < deg[dir]; i++){
int j = nxt_dir[dir][i];
int nx = x+dx[j]*d, ny = y+dy[j]*d;
if(vis[nx][ny]) continue;
if(abs(nx-o) + abs(ny-o) > left[d]) continue;
bool flag = false;
if(j == || j == ){
for(int tx = x+dx[j]; tx != nx ; tx+=dx[j]){
if(!~vis[tx][y]) {flag = true; break;}
}
}else {
for(int ty = y+dy[j]; ty != ny ; ty+=dy[j]){
if(!~vis[x][ty]) {flag = true; break;}
}
}
if(flag) continue;
path[d-] = j;
vis[nx][ny] = ;
dfs(nx,ny,d,j);
vis[nx][ny] = ;
}
} int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
for(int i = ; i < N; i++)
sum[i] = sum[i-]+i;
while(T--){
int k;
scanf("%d%d",&n,&k);
if(((n>>)&)^(n&)) { printf("Found 0 golygon(s).\n\n"); continue; }
int tx,ty;
memset(vis,,sizeof(vis));
for(int i = ; i < k; i++){
scanf("%d%d",&tx,&ty);
if(abs(tx)<o && abs(ty)<o ) vis[tx+o][ty+o] = -;
}
for(int i = ; i < n; i++)
left[i] = sum[n] - sum[i];
cnt = ;
dfs(o,o,,);
printf("Found %d golygon(s).\n\n",cnt);
}
return ;
}
最新文章
- [LeetCode] Find the Difference
- C#时间戳转时间-时间转时间戳
- curl --connect-timeout 判断国内外网络windows 批处理
- void 关键字
- javascript 字符串加密的几种方法
- json格式
- LAMP整理
- 戏(细)说Executor框架线程池任务执行全过程(上)
- 用ffmpeg把H264数据流解码成YUV420P
- C#中有关字符串去重的解决方案
- shell 字符串
- C语言范例学习06-上
- js计时功能
- 配置NTP网络时间自动校对系统时间和创建备份文件
- Oracle 存储过程笔记.
- JS 同步输入
- Luogu P2657 [SCOI2009]windy数
- weblogic 乱码
- PostgreSQL(一)教程 -----高级特性
- SSL证书链说明
热门文章
- 洛谷P3382 【模板】三分法(三分找凹凸点)
- HDU - 5451 Best Solver(循环节+矩阵快速幂)
- Git 时光穿梭鸡 删除文件 以及批量删除文件
- codeforces 547B【单调栈】
- [openjudge] 1455:An Easy Problem 贪心
- 背包dp
- 三、python的基本类型
- Luogu P4403 [BJWC2008]秦腾与教学评估【二分答案】By cellur925
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
- Linux上传下载工具FileZilla(GNU软件) 文件传输和配置文件修改