您的位置:首页 > 其它

zoj 1008 dfs 一种巧妙的剪枝

2014-10-20 10:23 288 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8

我做此题错了好几次,纠结了还几天,今天总算弄懂了自己的逻辑错误,又学到了一些新的知识

一下时我的代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;

int t;
const int sizen=36;
struct ele
{
int up;
int right;
int down;
int left;
}p[sizen];
int result[sizen];
int cnt[sizen];

int DFS(int x,int n)
{
int i;
if(x==n*n)
return 1;
for(i=0;i<t;i++)
{
if(!cnt[i])
continue;
if(x%n!=0)
if(p[i].left!=p[result[x-1]].right)
continue;
if(x/n!=0)
if(p[i].up!=p[result[x-n]].down)
continue;
cnt[i]--;
result[x]=i;
if(DFS(x+1,n))
return 1;
cnt[i]++;
}
return 0;
}

int main()
{
int n;
int q=0;
int i,j;
int x1,x2,x3,x4;
bool s=false;
while(scanf("%d",&n),n)
{
t=0;
memset(cnt,0,sizeof(cnt));
for(i=0;i<n*n;i++)
{
scanf("%d%d%d%d",&x1,&x2,&x3,&x4);
for(j=0;j<t;j++)
if(p[j].up==x1&&p[j].right==x2&&p[j].down==x3&&p[j].left==x4)
{
cnt[j]++;
break;
}
if(j==t)
{
p[t].up=x1;
p[t].right=x2;
p[t].down=x3;
p[t].left=x4;
cnt[t]++;
t++;
}
}
if(!s)
s=true;
else
printf("\n");
printf("Game %d: ",++q);
if(DFS(0,n))
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: