您的位置:首页 > 其它

Poj(2488),按照字典序深搜

2016-08-01 15:23 423 查看
题目链接:http://poj.org/problem?id=2488

思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序。

后来,凡哥说可以在搜索路径的时候就按照字典序搜索,这样一找到可行的路径就输出来就行了。这里我吸取了之前八皇后问题时犯的错,并且优化了一下写法,就是flag,这是参考了jhf大神的写法了。

但是jhf大神的写法,思路和我一样,但是他的x,y坐标还要转来转去,我就没有这么写了,还是按照我的代码风格好一些。

#include <stdio.h>
#include <string.h>

bool vis[30][30];
int to[8][2] = {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int R,C;
bool flag;

struct Path
{
int r;
int c;
} path[30*30];

bool judge(int r,int c)
{
if(r<0||r>=R||c<0||c>=C||vis[r][c])
return false;
return true;
}

void dfs(int r,int c,int k)
{
path[k].c = c;
path[k].r = r;

if(k==C*R)
{
flag = true;
return ;
}
for(int i=0; i<8; i++)
{
int rx = r+to[i][0];
int cx = c+to[i][1];
if(judge(rx,cx))
{
vis[rx][cx] = true;
dfs(rx,cx,k+1);
if(flag)
return;
vis[rx][cx] = false;
}
}
}

int main()
{
int t;
scanf("%d",&t);
for(int cases=1; cases<=t; cases++)
{
memset(vis,false,sizeof(vis));

printf("Scenario #%d:\n",cases);
scanf("%d%d",&R,&C);
for(int i=0; i<C; i++)
{
for(int j=0; j<R; j++)
{
flag = false;
vis[j][i] = true;
dfs(j,i,1);
if(flag)
break;
vis[j][i] = false;
}
if(flag)
break;
}
if(flag)
{
for(int i=1;i<=R*C;i++)
printf("%c%d",path[i].c+'A',path[i].r+1);
puts("\n");
}
else printf("impossible\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: