代码:
#include
#include
#include
using namespace std;
int n,k;
int r[55],c[5],rr[55];
int ans;
int g[55][55];
int dir[4][2]= {-1,0,0,-1,1,0,0,1};
bool cov[55][55];
struct node
{
int x,y;
int step;
} cur,tmp;
void bfs(int x,int y,int len)
{
bool tmpg[55][55]= {false};
cur.x=x;
cur.y=y;
cur.step=0;
tmpg[cur.x][cur.y]=true;
queue q;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.step==len)
{
continue;
}
for(int i=0; i<4; i++)
{
tmp.x=cur.x+dir[i][0];
tmp.y=cur.y+dir[i][1];
tmp.step=cur.step+1;
if((tmp.x>0&&tmp.x<=n)&&(tmp.y>0&&tmp.y<=n)&&!tmpg[tmp.x][tmp.y])
{
tmpg[tmp.x][tmp.y]=true;
q.push(tmp);
}
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(tmpg[i][j])
g[i][j]++;
}
}
}
void nbfs(int x,int y,int len)
{
bool tmpg[55][55]= {false};
cur.x=x;
cur.y=y;
cur.step=0;
g[cur.x][cur.y]=true;
queue q;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.step==len)
{
continue;
}
for(int i=0; i<4; i++)
{
tmp.x=cur.x+dir[i][0];
tmp.y=cur.y+dir[i][1];
tmp.step=cur.step+1;
if((tmp.x>0&&tmp.x<=n)&&(tmp.y>0&&tmp.y<=n)&&!tmpg[tmp.x][tmp.y])
{
tmpg[tmp.x][tmp.y]=true;
q.push(tmp);
}
}
}
for(int i=1; i<=n; i++)
{
for(int j =1; j<=n; j++)
if(tmpg[i][j])
g[i][j]--;
}
}
bool is()
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(g[i][j]==0&&!cov[i][j])
{
break;
}
}
if(j!=n+1)
break;
}
if(i==n+1)
return true;
return false;
}
bool dfs(int des,int curh)
{
if(des>ans||curh>k)
return false;
if(des==ans)
{
if(is())
return true;
return false;
}
bfs(r[curh],c[curh],rr[curh]);
if(dfs(des+1,curh+1)) return true;
nbfs(r[curh],c[curh],rr[curh]);
if(dfs(des,curh+1)) return true;
return false;
}
int main()
{
while(scanf("%d",&n),n)
{
scanf("%d",&k);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
g[i][j]=0,cov[i][j]=false;
}
for(int i=0; i