poj 2488 A Knight's Journey

#include<iostream>        //dfs,注意字典顺序
using namespace std;
int ans[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}}; //按字典序排列
int t,r,c,n,path[30][2],vis[30][30],rear;
void dfs(int x,int y)
{
for(int i=0;i<8;++i)
{
int px=x+ans[i][0],py=y+ans[i][1];
if(px>0&&px<=r&&py>0&&py<=c&&!vis[px][py])
{
vis[px][py]
=1;
path[
++rear][0]=py;path[rear][1]=px;
if(rear==r*c)
return ;
dfs(px,py);
if(rear==r*c)
return ;
vis[px][py]
=0;
rear
--;
}
}
}
int main()
{
cin
>>t;
for(int i=1;i<=t;++i)
{
cin
>>r>>c;
printf(
"Scenario #%d:\n",i);
rear
=0;
for(int q=1;q<=c&&rear<r*c;++q) //两个for循环也是按字典序
for(int p=1;p<=r&&rear<r*c;++p)
{
memset(vis,
0,sizeof(vis));
vis[p][q]
=1;path[1][0]=q;path[1][1]=p;rear=1;
if(rear==r*c)
break;
dfs(p,q);
}
if(rear==r*c)
{
for(int j=1;j<=rear;++j)
cout
<<char(path[j][0]+64)<<path[j][1];
cout
<<endl<<endl;
}
else
printf(
"impossible\n\n");
}
return 0;
}

  

ac,从(1,1)直接dfs也过,不知什么原因,可能数据较弱
#include<iostream>            //ac,从(1,1)直接dfs也过,不知什么原因,可能数据较弱
using namespace std;
int ans[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int t,r,c,n,path[30][2],vis[30][30],rear;
void dfs(int x,int y)
{
for(int i=0;i<8;++i)
{
int px=x+ans[i][0],py=y+ans[i][1];
if(px>0&&px<=r&&py>0&&py<=c&&!vis[px][py])
{
vis[px][py]
=1;
path[
++rear][0]=py;path[rear][1]=px;
if(rear==r*c)
return ;
dfs(px,py);
if(rear==r*c)
return ;
vis[px][py]
=0;
rear
--;
}
}
}
int main()
{
cin
>>t;
for(int i=1;i<=t;++i)
{
cin
>>r>>c;
printf(
"Scenario #%d:\n",i);
memset(vis,
0,sizeof(vis));
rear
=1;
vis[
1][1]=1;path[1][0]=1;path[1][1]=1;
dfs(
1,1);
if(rear==r*c)
{
for(int j=1;j<=rear;++j)
cout
<<char(path[j][0]+64)<<path[j][1];
cout
<<endl<<endl;
}
else
printf(
"impossible\n\n");
}
return 0;
}

  

posted on 2011-07-22 20:14  sysu_mjc  阅读(118)  评论(0编辑  收藏  举报

导航