当前位置:科技动态 > 练习 7-2 uva225(回溯)

练习 7-2 uva225(回溯)

  • 发布:2023-09-29 20:24

-->

问题:从点(0.0)开始,第一次走一步...第k次走k步,每次都要转90度,不能重复取点。找出k次后回到起点的所有情况。输出按字母顺序从小到大排列。

想法:

将所有坐标添加到220,确保它们是正数,然后搜索。

#包括
#包括
#包括
#包括
#包括
#包括
typedef long long ll;
使用命名空间 std;
const int inf = 0x3f3f3f3f;
int tx[100];
int ty[100];
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
int vis[1000][1000];
char dire[] = {"ensw"};
全部;
结构节点
{
int 步骤;
int x,y;
int dir;
};
int n,k;
整数 ans[200]; bool Judge(int i,node a) //判断是否可以走
{
int x = a.x+dir[i][0]*(a.step+1);
int y = a.y+dir[i][1]*(a.step+1);
if(i == 1 || i == 2)
{
for(int j = 0; j < k; j++)
{
if(tx[j] == x && ty[j] >= y && ty[j] <= a.y && i == 2)
返回 true;
if(tx[j] == x && ty[j] >= a.y && ty[j] <= y && i == 1)
返回 true;
}
}
if(i == 0 || i == 3)
{
for(int j = 0; j < k; j++)
{
if(ty[j] == y && tx[j] >= x && tx[j] <= a.x && i == 3)
返回 true;
if(ty[j] == y && tx[j] >= a.x && tx[j] <= x && i == 0)
返回 true;
}
}
返回 false;
} void dfs(节点a)
{
if(a.x == 220 && a.y == 220 && a.step == n)
{
// printf("%d\n",a.step);
// for(int i = 0; i < a.step;i++)
// printf("%d ",ans[i]);
// printf("\n");
for(int i = 0; i < a.step; i++)
{
printf("%c",dire[ans[i]]);
}
printf("\n");
全部++;
返回;
}
if(a.step >= n)
返回; for(int i = 0; i < 4; i++)
{
if(i == 0 && (a.dir == 3||a.dir == 0))继续;
if(i == 1 && (a.dir == 2||a.dir == 1)) 继续;
if(i == 2 && (a.dir == 1||a.dir == 2)) 继续;
if(i == 3 && (a.dir == 0||a.dir == 3)) 继续; if(判断(i,a))
继续;
节点 tt = a;
ans[a.step] = i;
tt.x = a.x+dir[i][0]*(a.step+1);
tt.y = a.y+dir[i][1]*(a.step+1);
if(vis[tt.x][tt.y])
继续;
vis[tt.x][tt.y] = 1;
tt.dir = i;
tt.step = a.step + 1;
dfs(tt);
vis[tt.x][tt.y] = 0;
}
返回;
} int main()
{
int cas = 1,T;
int a,b;
scanf("%d ",&T);
而(T--)
{
scanf("%d %d ",&n,&k);
memset(vis,0,sizeof(vis));
for(int i = 0; i < k; i++)
{
scanf("%d %d",&a,&b);
tx[i] = a+220;
ty[i] = b+220;
}
节点cur;
全部 = 0;
cur.x = 220,cur.y = 220,cur.step = 0,cur.dir = -1;
dfs(cur);
printf("找到 %d 个 golygon(s)。\n",all);
printf("\n");
}
返回0;
}

  

-->

相关文章

最新资讯

热门推荐