spoj196
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> using namespace std; int linjie[110][110]; int ans[110]; int n; int t[110]; int meet[110][110];//-1表示未初始化,0表示不能相遇,1表示能相遇 void found(int l,int r) { int i; meet[l][r]=0; if(l==r-1) { meet[l][r]=1; return; } for(i=l+1;i<r;i++) { if(meet[l][i]==-1) { found(l,i); } if(meet[i][r]==-1) { found(i,r); } if(meet[l][i]==1&&meet[i][r]==1&&(linjie[t[l]][t[i]]||linjie[t[r]][t[i]])) { meet[l][r]=1; break; } } } bool check(int x) { int i; for(i=0;i<n;i++) { t[i]=x; x++; if(x==n+1) { x=1; } } t[n]=x; memset(meet,-1,sizeof(meet)); found(0,n); if(meet[0][n]==1) { return true; } return false; } int main() { int total; scanf("%d",&total); while(total--) { scanf("%d",&n); getchar(); int i,j; char ch; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%c",&ch); linjie[i][j]=ch-'0'; } getchar(); } int counter=0; for(i=1;i<=n;i++) { if(check(i)) { ans[counter++]=i; } } printf("%d\n",counter); for(i=0;i<counter;i++) { printf("%d\n",ans[i]); } } return 0; } //310ms