暴力的迭代加深搜索即可。12ms无语了……
注意别都错或读露题目。
1.结束点在第一行开始点的右边即可
2.至少重复两次
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int d1x[]={-1,-1,1,1,0,0};
const int d1y[]={0,1,0,1,-1,1};
const int d0x[]={-1,-1,1,1,0,0};
const int d0y[]={0,-1,0,-1,-1,1};
char a[10][10];
char ans[100],tmp[100];
bool vis[10][10];
bool solve;
int r,c,n,y0;
bool check(int i,int j)
{
return ((i%2==1)&&(1<=j)&&(j<=c))||((i%2==0)&&(1<=j)&&(j<=c+1));
}
bool dfs(int x,int y,int step,int limit,bool al)
{
if(solve)return true;
//
if(x==r)al=true;
//cut
if(step>n && tmp[step]!=tmp[step-n])return false;//1
if(al)//2
{
if(step+x-1>limit)return false;
}
else
{
if(step+r-x+r-1>limit)return false;
}
//final
if(step==limit)
{
if(al && y>y0 && x==1)
{
for(int i=1;i<=limit;i++)
ans[i]=tmp[i];
ans[limit+1]='\0';
solve=true;
return true;
}
return false;
}
//dfs
if(x%2==1)
{
for(int i=0;i<=5;i++)
{
int xx=x+d1x[i],yy=y+d1y[i];
if(check(xx,yy)&&!vis[xx][yy])
{
vis[xx][yy]=true;
tmp[step+1]=a[xx][yy];
dfs(xx,yy,step+1,limit,al);
vis[xx][yy]=false;
}
}
}
else
{
for(int i=0;i<=5;i++)
{
int xx=x+d0x[i],yy=y+d0y[i];
if(check(xx,yy)&&!vis[xx][yy])
{
vis[xx][yy]=true;
tmp[step+1]=a[xx][yy];
dfs(xx,yy,step+1,limit,al);
vis[xx][yy]=false;
}
}
}
if(solve)return true;else return false;
}
int main()
{
//freopen("data","r",stdin);
while(scanf("%d",&r),r)
{
scanf("%d%d",&c,&n);
int tot=0;
for(int i=1;i<=r;i++)
{
char s[3];
for(int j=1;j<=c+(i%2==0);j++)
{
tot++;
scanf("%s",s);
a[i][j]=s[0];
}
}
solve=false;
for(int i=2*n;i<=tot;i+=n)
{
for(y0=1;y0<=c;y0++)
{
memset(vis,false,sizeof(vis));
tmp[1]=a[1][y0];
vis[1][y0]=true;
dfs(1,y0,1,i,false);
if(solve)break;
}
if(solve)break;
}
if(!solve)
printf("no solution\n");
else
printf("%s\n",ans+1);
}
return 0;
}