RT,死循环还是效率太菜?
#include<bits/stdc++.h>
#define ll long long
#define YJL_DRC_LCH_WJY_WQY_ZZH using
#define AK namespace
#define IOI std
YJL_DRC_LCH_WJY_WQY_ZZH AK IOI;
const int N=505;
int n,m;
bool a;
struct Node
{
int l,r,u,d,row,col;
}node[10005];
int ans[N],row[N],cnum[N],tot,dep;
void init_rc()
{
for(int i=0;i<=m;i++)
{
node[i].l=i-1,node[i].r=i+1;
node[i].u=node[i].d=i;
node[i].row=0,node[i].col=i;
}
node[0].l=m,node[m].r=0,tot=m;
}
void addn(int r,int c)
{
++tot;
node[tot].row=r,node[tot].col=c;
node[tot].u=node[c].u,node[c].u=tot;
node[tot].d=c,node[node[tot].u].d=tot;
int &rt=row[r];
if(rt)
{
node[tot].l=node[rt].l,node[tot].r=rt;
node[node[tot].l].r=tot,node[rt].l=tot;
}
else
{
rt=tot;
node[tot].r=node[tot].l=tot;
}
}
void delc(int c)
{
for(int i=node[c].d;i!=c;i=node[i].d)
for(int j=node[i].r;j!=i;j=node[j].r)
{
node[node[j].u].d=node[j].d;
node[node[j].d].u=node[j].u;
cnum[node[j].col]--;
}
node[node[c].r].l=node[c].l,node[node[c].l].r=node[c].r;
}
void resc(int c)
{
node[node[c].r].l=node[node[c].l].r=c;
for(int i=node[c].d;i!=c;i=node[i].d)
for(int j=node[i].r;j!=i;j=node[j].r)
{
node[node[j].u].d=j;
node[node[j].d].u=j;
cnum[node[j].col]++;
}
}
void dance()
{
if(node[0].r==0)
{
for(int i=1;i<=dep;i++)cout<<ans[i]<<" ";
exit(0);
}
int Col=node[0].r;
for(int i=node[0].r;i;i=node[i].r)
if(cnum[i]<cnum[Col])Col=i;
delc(Col);
dep++;
for(int i=node[Col].d;i!=Col;i=node[i].d)
{
ans[dep]=node[i].row;
for(int j=node[i].r;j!=i;j=node[j].r)delc(node[j].col);
dance();
for(int j=node[i].r;j!=i;j=node[j].r)resc(node[j].col);
}
resc(Col);
dep--;
}
int main()
{
freopen("P4929_8.in","r",stdin);
freopen("P4929.out","w",stdout);
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
init_rc();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a;
if(a)addn(i,j);
}
dance();
puts("No Solution!");
return 0;
}