您的位置:首页 > 其它

poj2488_dfs_骑士

2012-07-23 12:14 330 查看
这也是一道DFS题,但写的还是不好。

题意:给一个矩阵r*c,求骑士可以从任意一点开始,是否能将这个矩阵中的各个点都走一遍。

分析:

1.字典顺序啊, lexicographical,当时也没管啥意思,唉。

2.不需要找到所有的情况,即如果遍历各点成功,就return ;

代码:

View Code

#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

const int maxnum=27;   //27,怎么会是8呢
bool array[maxnum][maxnum];
int lenx[maxnum*maxnum];
int leny[maxnum*maxnum];
int ans,r,c,cur;
int lx[8]={-1,1,-2,2,-2,2,-1,1};  //字典顺序啊
int ly[8]={-2,-2,-1,-1,1,1,2,2};

bool judge(int x,int y)
{
if(x>=1 && x<=r && y>=1 && y<=c && !array[x][y])  //老不加!array[][]
return true;
return false;
}

void dfs(int x,int y)
{
if(ans==r*c) return ;  //终止条件
int i;
for(i=0;i<8;i++)
if(judge(x+lx[i],y+ly[i]))
{
array[x+lx[i]][y+ly[i]]=true;
ans++;
lenx[cur]=x+lx[i];
leny[cur]=y+ly[i];
cur++;
dfs(x+lx[i],y+ly[i]);
if(ans==r*c) return ;   //没加,就会回溯
array[x+lx[i]][y+ly[i]]=false;
ans--;
cur--;
}
}

int main()
{
int num,i,j,k;
bool flag;
scanf("%d",&num);
for(k=1;k<=num;k++)
{
scanf("%d%d",&r,&c);
flag=false;
for(j=1;j<=c;j++)
{
for(i=1;i<=r;i++)
{
memset(array,false,sizeof(array));
array[i][j]=true;  //没加
ans=1;  //初始错了
cur=1;
lenx[cur]=i;
leny[cur]=j;
cur++;
dfs(i,j);
if(ans==r*c)
{
flag=true;
break;
}
}
if(flag)break;
}
printf("Scenario #%d:\n",k);
if(j==c+1)
printf("impossible\n");
else
{
for(i=1;i<r*c;i++)
printf("%c%d",leny[i]-1+'A',lenx[i]);
if(i==r*c)
printf("%c%d\n",leny[i]-1+'A',lenx[i]);
}
printf("\n");
}
return 0;
}


这都是dfs的简单题啊,看来得狂练。

此题也是tju oj1702
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: