您的位置:首页 > 其它

POJ 1659 Frogs' Neighborhood(DFS)

2012-07-08 15:58 459 查看
题目链接

这个题1Y,还是想了几个剪枝63ms,如果直接去暴力的10*10的有点大,因为这相当于无向图,只须枚举一半就可以,也就是45个点,其实还是有点悬的,再加一个剪枝,中间加入判断把不符合情况的,直接淘汰。实习回来的第一个题,DFS调试了半天。。。

#include <stdio.h>
#include <string.h>
int p[101][101],o1[11],o2[11],z,n;
void dfs(int x,int y)
{
int r,c,i,j;
if(z) return ;
if(o2[x] > o1[x]||o2[y] > o1[y])
return ;
if(x > n)
{
for(i = 1; i <= n; i ++)
{
if(o2[i] != o1[i])
break;
}
if(i == n+1)
{
z = 1;
printf("YES\n");
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
{
if(j == 1)
printf("%d",p[i][j]);
else if(j > i)
printf(" %d",p[j][i]);
else
printf(" %d",p[i][j]);
}
printf("\n");
}
}
return;
}
if(y+1 >= x)
{
r = x+1;
c = 1;
}
else
{
r = x;
c = y+1;
}
o2[x] ++;
o2[y] ++;
p[x][y] = 1;
dfs(r,c);
p[x][y] = 0;
o2[x] --;
o2[y] --;
dfs(r,c);
}
int main()
{
int i,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
z = 0;
memset(p,0,sizeof(p));
memset(o2,0,sizeof(o2));
for(i = 1; i <= n; i ++)
scanf("%d",&o1[i]);
dfs(2,1);
if(!z)
printf("NO\n");
if(t != 0)
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: