http://acm.pku.edu.cn/JudgeOnline/problem?id=1130

Код:
#include <stdio.h>
#include <malloc.h>
int m,n;
int *iv,*ie,*in,*ic,*id;
void lookup(int idx,int idx_id)
{
int i,j,k;
if (idx==n)
{
for (i=0;i<idx_id ;++i )
{
in[id[i]]++;
if (ic[id[i]] > idx_id-i)
{
ic[id[i]]=idx_id-i;
}
}
}
iv[idx]=1;
id[idx_id]=idx;
for (i=0;i<m ;++i )
{
if (ie[idx*m+i]==1 && iv[i]==0)
{
lookup(i,idx_id+1);
}
}
iv[idx]=0;
}
int main()
{
int i,j,k;
scanf("%d %d",&m,&n);
ie=(int *)malloc(m*m*sizeof(int));
iv=(int *)malloc(m*sizeof(int));
id=(int *)malloc(m*sizeof(int));
in=(int *)malloc(m*sizeof(int));
ic=(int *)malloc(m*sizeof(int));
for (i=0;i<m ;++i )
{
iv[i]=0;
in[i]=0;
id[i]=0;
ic[i]=m;
for (j=0;j<m ;++j )
{
ie[i*m+j]=0;
}
}
while(scanf("%d %d",&i,&j)==2 && !(i==0 && j==0))
{
ie[i*m+j]=1;
}
lookup(0,0);
j=m;
for (i=0;i<m ;++i )
{
if (in[i]==in[0] && ic[i]<j)
{
k=i;
}
}
printf("Put guards in room %d.\n",k);
return 0;
}