题解:考场上打得一手好暴力。DFS骗得40分
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> #include<queue> #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1502; const int M=1125752; int n; char s[N]; struct node{ int to; int next; }e[M*2]; int head[N],cnt,vis[N]; void add(int x,int y){ e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt; } ll ans; void dfs(int now,int sum){ if(sum==4) { ans++; return; } for(int i=head[now];i;i=e[i].next){ int v=e[i].to; if(vis[v]==1) continue; vis[v]=1; dfs(v,sum+1); vis[v]=0; } } int main(){ freopen("tour.in","r",stdin); freopen("tour.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s\n",s+1); for(int j=1;j<=n;j++) if(s[j]=='1') add(i,j); } for(int i=1;i<=n;i++) { vis[i]=1; dfs(i,1); vis[i]=0; } printf("%lld",ans); return 0; }