UVa 225 - Golygons
2015-08-20 11:02
288 查看
这道题不难,是一道简单的dfs回溯,并不困难,只不过有一个坑就是一个城市不能够走两次(特别是原点不能够在不到重点的时候走到。。。)被这个坑了好久之后,看了大大们的博客才知道了这个,真不知道大大们是怎么意识到这个问题的,题目里貌似没有说。。。
代码还可以进行剪枝优化,此处略去,代码如下:
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
int mstps;
typedef pair<int, int> pii;
pii stlst[100];
int rstps;
int n, k;
bool isbet(int st, int ed, int num)
{
if(st > ed)
swap(st, ed);
return num >= st && num <= ed;
}
bool cango(pii st, pii ed)
{
if(st.first == ed.first)
for(int i = 0; i < k; ++i)
{
if(stlst[i].first == st.first && isbet(st.second, ed.second, stlst[i].second))
return false;
}
else if(st.second == ed.second)
for(int i = 0; i < k; ++i)
{
if(stlst[i].second == st.second && isbet(st.first, ed.first, stlst[i].first))
return false;
}
return true;
}
vector<char> ways;
vector<pii> pass;
void dfs(pii st, int stps, char twd)
{
if(st != make_pair(0, 0))
{
for(int i = 0; i < pass.size(); ++i)
if(pass[i] == st)
return;
}
else if(stps && stps != mstps){
return;
}
pass.push_back(st);
if(twd)
ways.push_back(twd);
if(stps == mstps)
{
if(st == make_pair(0, 0))
{
++rstps;
for(int i = 0; i < ways.size(); ++i)
{
printf("%c", ways[i]);
}
printf("\n");
}
pass.pop_back();
ways.pop_back();
return ;
}
if( (twd != 'e' && twd != 'w') && cango(st, make_pair(st.first+stps+1, st.second)))
dfs(make_pair(st.first+stps+1, st.second), stps+1, 'e');
if((twd != 'n' && twd != 's') && cango(st, make_pair(st.first, st.second+stps+1)))
dfs(make_pair(st.first, st.second+stps+1), stps+1, 'n');
if((twd != 'n' && twd != 's') && cango(st, make_pair(st.first, st.second-stps-1)))
dfs(make_pair(st.first, st.second-stps-1), stps+1, 's');
if((twd != 'e' && twd != 'w') && cango(st, make_pair(st.first-stps-1, st.second)))
dfs(make_pair(st.first-stps-1, st.second), stps+1, 'w');
ways.pop_back();
pass.pop_back();
}
int main()
{
scanf("%d", &n);
while(n--)
{
rstps = 0;
scanf("%d", &mstps);
scanf("%d", &k);
for(int i = 0; i < k; ++i)
{
int x, y;
scanf("%d %d", &x, &y);
stlst[i] = make_pair(x, y);
}
//news ensw
ways.clear();
dfs(make_pair(0, 0), 0, 0);
ways.clear();
printf("Found %d golygon(s).\n\n", rstps);
}
}
代码还可以进行剪枝优化,此处略去,代码如下:
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
int mstps;
typedef pair<int, int> pii;
pii stlst[100];
int rstps;
int n, k;
bool isbet(int st, int ed, int num)
{
if(st > ed)
swap(st, ed);
return num >= st && num <= ed;
}
bool cango(pii st, pii ed)
{
if(st.first == ed.first)
for(int i = 0; i < k; ++i)
{
if(stlst[i].first == st.first && isbet(st.second, ed.second, stlst[i].second))
return false;
}
else if(st.second == ed.second)
for(int i = 0; i < k; ++i)
{
if(stlst[i].second == st.second && isbet(st.first, ed.first, stlst[i].first))
return false;
}
return true;
}
vector<char> ways;
vector<pii> pass;
void dfs(pii st, int stps, char twd)
{
if(st != make_pair(0, 0))
{
for(int i = 0; i < pass.size(); ++i)
if(pass[i] == st)
return;
}
else if(stps && stps != mstps){
return;
}
pass.push_back(st);
if(twd)
ways.push_back(twd);
if(stps == mstps)
{
if(st == make_pair(0, 0))
{
++rstps;
for(int i = 0; i < ways.size(); ++i)
{
printf("%c", ways[i]);
}
printf("\n");
}
pass.pop_back();
ways.pop_back();
return ;
}
if( (twd != 'e' && twd != 'w') && cango(st, make_pair(st.first+stps+1, st.second)))
dfs(make_pair(st.first+stps+1, st.second), stps+1, 'e');
if((twd != 'n' && twd != 's') && cango(st, make_pair(st.first, st.second+stps+1)))
dfs(make_pair(st.first, st.second+stps+1), stps+1, 'n');
if((twd != 'n' && twd != 's') && cango(st, make_pair(st.first, st.second-stps-1)))
dfs(make_pair(st.first, st.second-stps-1), stps+1, 's');
if((twd != 'e' && twd != 'w') && cango(st, make_pair(st.first-stps-1, st.second)))
dfs(make_pair(st.first-stps-1, st.second), stps+1, 'w');
ways.pop_back();
pass.pop_back();
}
int main()
{
scanf("%d", &n);
while(n--)
{
rstps = 0;
scanf("%d", &mstps);
scanf("%d", &k);
for(int i = 0; i < k; ++i)
{
int x, y;
scanf("%d %d", &x, &y);
stlst[i] = make_pair(x, y);
}
//news ensw
ways.clear();
dfs(make_pair(0, 0), 0, 0);
ways.clear();
printf("Found %d golygon(s).\n\n", rstps);
}
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- 简单的四则运算
- 数的奇偶性
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- 矩阵的乘法操作
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game