ZOJ-1008-Gnome Tetravex

来源:互联网 发布:淘宝店铺一键装修 编辑:程序博客网 时间:2024/04/26 15:44

一道不算难的DFS题,但是这个题要注意下其测试数据存在重复方块,如果不考虑去重的情况就会超时。另外换行符不能多输出,Game 1: 分号后面还有一个空格~

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=30;struct node{    int top;    int buttom;    int left;    int right;    int num;    bool operator == (const node& a)const    {if(top==a.top&&buttom==a.buttom&&left==a.left&&right==a.right)    return true;return false;    }}a[30];int n,m,dex[maxn][maxn];bool ans;void DFS(int now){    if(ans)return ;    if(now==n*n)    {ans=true;return ;    }    int x=now/n;    int y=now%n;    for(int i=0;i<m;i++)    {if(!a[i].num)    continue;if(x>0&&a[i].top!=a[dex[x-1][y]].buttom)    continue;if(y>0&&a[i].left!=a[dex[x][y-1]].right)    continue;a[i].num--;dex[x][y]=i;DFS(now+1);    if(ans)    return;a[i].num++;    }}int main(){    int cas=1;    while(scanf("%d",&n)&&n)    {ans=m=false;for(int i=0;i<n*n;i++){    scanf("%d%d%d%d",&a[i].top,&a[i].right,&a[i].buttom,&a[i].left);    a[i].num=1;    bool find=0;    for(int j=0;j<m;j++)if(a[i]==a[j]){    a[j].num++;    find=1;    break;}    if(!find)a[m++]=a[i];}DFS(0);if(cas>1)    printf("\n");printf("Game %d: ",cas++);if(ans)    printf("Possible\n");else    printf("Impossible\n");    }    return 0;}