附上本人写得很烂的用坐标差模拟指针的舞蹈链(不喜勿喷
话说RE的原因是啥啊(
#include <bits/stdc++.h>
using namespace std;
struct node{
int upx,downx,lefty,righty,h,l;
bool b;
};
stack <int>ans;
node a[501][501];
int n,m,ha;
bool fl;
void restart(){
for(int i=0;i<=m;i++){
if(!i){
a[0][0].lefty=m;
a[0][0].righty=1;
}else if(i==m){
a[0][m].righty=-m;
a[0][m].lefty=-1;
}else{
a[0][i].righty=1;
a[0][i].lefty=-1;
}
a[0][i].b=1;
a[0][i].h=0;
a[0][i].l=i;
}
}
void start(){
int k,l;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j].b){
k=i;l=j;
while(true){
k++;
if(k==n+1){
k-=(1+n);
}
if(a[k][l].b){
a[i][l].downx=k-i;
a[k][l].upx=i-k;
break;
}
}
while(true){
k--;
if(k==-1){
k+=(1+n);
}
if(a[k][l].b){
a[i][l].upx=k-i;
a[k][l].downx=i-k;
break;
}
}
while(true){
l--;
if(l==-1){
l+=(1+n);
}
if(a[k][l].b){
a[k][j].lefty=l-i;
a[k][l].righty=i-l;
break;
}
}
while(true){
l++;
if(l==m+1){
l-=(1+m);
}
if(a[k][l].b){
a[k][j].righty=l-i;
a[k][l].lefty=i-l;
break;
}
}
}
}
}
}
bool dance(int ud,bool flag2){
int po[1000],po2[1000],p3;
bool flag=0;
if(!(a[0][0].righty-m) && fl){
return 1;
}
if(ans.size()==m){
return 0;
}
if(ans.size()+1==m){
fl=1;
}else{
fl=0;
}
if(!flag2){
for(int i=1;i<=m;i++){
if(a[0][i].upx){
flag=1;
break;
}
}
}
if(!flag){
memset(po,0,sizeof(po));
memset(po2,0,sizeof(po2));
ans.pop();
for(int i=0;i<=n;i++){
if(a[i][ud].b){
a[i][a[i][ud].lefty+a[i][ud].l].righty-=a[i][ud].righty;
a[i][a[i][ud].righty+a[i][ud].l].lefty-=a[i][ud].lefty;
if(i){
po[i]=1;
}
}
}
for(int i=0;i<=n;i++){
if(po[i]){
for(int j=1;j<=m;j++){
if(j==ud){
continue;
}
if(a[i][j].b){
a[a[i][j].h+a[i][j].upx][j].downx-=a[i][j].downx;
a[a[i][j].h+a[i][j].downx][j].upx-=a[i][j].upx;
po2[j]=j;
}
}
}
}
for(int i=1;i<=m;i++){
if(po2[i]){
for(int j=0;j<=n;j++){
if(po2[i]==j){
continue;
}
if(a[j][i].b){
a[j][a[j][i].lefty+a[j][i].l].righty-=a[j][i].righty;
a[j][a[j][i].righty+a[j][i].l].lefty-=a[j][i].lefty;
}
}
}
}
if(a[0][ud].l+a[0][ud].righty){
ans.push(a[0][ud].l+a[0][ud].righty);
if(dance(a[0][ud].l+a[0][ud].righty,0)){
return 1;
}else{
ans.pop();
if(ans.empty()){
return 0;
}else{
dance(ans.top(),1);
}
}
}else{
return 0;
}
}
memset(po,0,sizeof(po));
memset(po2,0,sizeof(po2));
for(int i=0;i<=n;i++){
if(a[i][ud].b){
a[i][a[i][ud].lefty+a[i][ud].l].righty+=a[i][ud].righty;
a[i][a[i][ud].righty+a[i][ud].l].lefty+=a[i][ud].lefty;
if(i){
po[i]=1;
}
}
}
for(int i=0;i<=n;i++){
if(po[i]){
for(int j=1;j<=m;j++){
if(j==ud){
continue;
}
if(a[i][j].b){
a[a[i][j].h+a[i][j].upx][j].downx+=a[i][j].downx;
a[a[i][j].h+a[i][j].downx][j].upx+=a[i][j].upx;
po2[j]=j;
}
}
}
}
for(int i=1;i<=m;i++){
if(po2[i]){
for(int j=0;j<=n;j++){
if(po2[i]==j){
continue;
}
if(a[j][i].b){
a[j][a[j][i].lefty+a[j][i].l].righty+=a[j][i].righty;
a[j][a[j][i].righty+a[j][i].l].lefty+=a[j][i].lefty;
}
}
}
}
ans.push(a[0][0].righty);
return dance(a[0][0].righty,0);
}
void out(){
int ap[1000],count=1;
while(!ans.empty()){
ap[count]=ans.top();
ans.pop();
count++;
}
for(int i=1;i<count;i++){
if(ap[i]){
cout << ap[i] << " ";
}
}
}
int main(){
cin >> n >> m;
restart();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin >> a[j][i].b;
a[j][i].h=i;
a[j][i].l=j;
}
}
start();
ans.push(1);
if(dance(1,0)){
out();
}else{
cout << "No Solution!";
}
return 0;
}