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;
}