您的位置:首页 > 其它

ZOJ 1008

2015-04-06 20:41 441 查看
这道题也是搜索,使用深度优先搜索就可以。当然,还是要注意一些小技巧的使用,来防止你的程序超时!

在注释中我标注了我使用的办法。

#include<stdio.h>
typedef struct
{
int up;
int right;
int down;
int left;
}node;
typedef struct
{
node data;
int num;
}lnode;
node str[5][5];
int n;
int flag;

void dfs(lnode *base,int cnt,int k);
int ret(node *p,int k);

int main()
{
int count = 0;
while(scanf("%d",&n)&&n!=0)
{
lnode base[25] = {0};
int i,cnt = 0;
flag = 0;
for(i = 0;i < n*n;i++)
{
node t;
int j;
scanf("%d %d %d %d",&t.up,&t.right,&t.down,&t.left);
for(j = 0;j < cnt;j++)
{
if(t.down==base[j].data.down&&t.up==base[j].data.up&&t.left==base[j].data.left&&t.right==base[j].data.right)  //如果方块中数字相同,只存一次,累计个数即可
{
base[j].num++;
break;
}
}
if(j==cnt)
{
base[j].data = t;
base[j].num++;
cnt++;
}
}
dfs(base,cnt,0);
count++;
if(count>1)
{
printf("\n");
}
printf("Game %d: ",count);
if(flag)
{
printf("Possible\n");
}
else
{
printf("Impossible\n");
}
}
return 0;
}

void dfs(lnode *base,int cnt,int k)
{
int x,y;
int i;
x = k/n;
y = k%n;
if(k==n*n||flag)           //只要有一种情况成功,函数就可以返回了,这样可以节省时间
{
flag = 1;
return;
}
for(i = 0;i < cnt;i++)
{
if(base[i].num&&ret(&base[i].data,k))
{
base[i].num--;
str[x][y] = base[i].data;
dfs(base,cnt,k+1);
base[i].num++;
}
}
}

int ret(node *p,int k)
{
int flag = 1;
int x,y;
x = k/n;
y = k%n;
if(x>0&&p->up!=str[x-1][y].down)
{
flag = 0;
}
if(y>0&&p->left!=str[x][y-1].right)
{
flag = 0;
}
return flag;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: