下面是我写的C++,思想是枚举方向,如果下一个方向被标记,则按原来方向再搜下一个点,否则跳到下一个点并标记
按说 枚举每个点为起点的时候 1,3,7,9跑出来的ans是相同的;
2,4,6,8跑出来的ans也是相同的,为什么 我这代码跑出来2,4,6,8,不是相同的,并且最后加起来的答案应该是30多万,我的答案相差很大,求大神解!!!
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=1e5+10;
int vis[10],vis1[10],in[10],out[10],head[200],q,ans,a[5][5];
int dir[12][2]={1,0,0,1,-1,0,0,-1,-1,-1,-1,1,1,1,1,-1,-2,-1,2,1,-2,1,2,-1};
struct point {
int to,next;
}pt[200];
struct pp{
int x;
int y;
}sto[10];
void add(int u,int v)
{
pt[q].next=head[u];
pt[q].to=v;
head[u]=q++;
}
void dfs(int po,int x,int y,int len)
{
//cout<<po<<"~~~~~~~~"<<endl;
if (len>=4)
ans++;
int flag=0;
/*for (int i=head[po];i!=-1;i=pt[i].next)
{
cout<<"%%%%%"<<endl;
int to=pt[i].to;
if (!vis[to])
{
flag++;
vis[to]=1;
dfs(to,sto[to].x,sto[to].y,len+1);
vis[to]=0;
}
}*/
if (!flag)
{
for (int i=0;i<12;i++) //枚举12个方向
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if (xx>=1&&xx<=3&&yy>=1&&yy<=3&&!vis[a[xx][yy]]) //下一步如果没被标记;
{
vis[a[xx][yy]]=1;
dfs(a[xx][yy],xx,yy,len+1);
vis[a[xx][yy]]=0;
}
else if (xx>=1&&xx<=3&&yy>=1&&yy<=3&&i<=7)// 下一步被标记,按照方向再走一步,看是否被标记
{
int xxx=xx+dir[i][0];
int yyy=yy+dir[i][1];
if (xxx>=1&&xxx<=3&&yyy>=1&&yyy<=3&&!vis[a[xxx][yyy]])
{
vis[a[xxx][yyy]]=1;
dfs(a[xxx][yyy],xxx,yyy,len+1);
vis[a[xxx][yyy]]=0;
}
}
}
}
}
int main()
{
int t,len,s=1,n,u,v;
for (int i=1;i<=3;i++)
for (int j=1;j<=3;j++)
a[i][j]=s++;
cin>>t;
for (int i=1;i<=t;i++)
{
int k=1;
ans=0;
cin>>n;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
q=0;
for (int i=1;i<=n;i++)
{
cin>>u>>v;
add(u,v);
add(v,u);
}
for (int i=1;i<=3;i++) //枚举每个点当起点
for (int j=1;j<=3;j++)
{
ans=0;
len=1;
//sto[k].x=i;
//sto[k].y=j;
vis[k]=1;
dfs(k++,i,j,len);
cout<<ans<<"######"<<endl;
vis[k-1]=0;
for (int s=1;s<=9;s++)
cout<<vis[s]<<" ";
cout<<endl;
}
//cout<<ans<<endl;
}
return 0;
}