ZOJ1008(深搜)

思路:暴搜,枚举每个位置的卡牌,直到找到结果为止。要注意的是合重,相同的卡牌合并在一起,记录数量,否则很容易超时。


#include<iostream>
using namespace std;
struct Node
{
    int u,r,d,l,len;
}node[25];

int n,sum,tmp,tag;
int map[5][5];
void dfs(int index)
{
    if(index==tmp)
    {
        tag=1;
        return;
    }
    if(tag)
    return;
    int x=index/n,y=index%n;
    for(int i = 0; i < sum; i++)
    {
        if(node[i].len==0)
        continue;
        if(x>0&&node[i].u!=node[map[x-1][y]].d||y>0&&node[i].l!=node[map[x][y-1]].r)
        continue;
        map[x][y]=i;
        node[i].len--;
        dfs(index+1);
        if(tag)
        return;
        node[i].len++;
    }
}

int main()
{
    int cou= 0;
    while(cin>>n&&n)
    {
        tag=0;
        tmp=n*n;
        sum=0;
        int u,r,d,l;
        for(int i = 0;i < 25; i++)
        node[i].len=0;
        for(int i = 0; i < tmp;i++)
        {
            cin>>u>>r>>d>>l;
            int j;
            for(j =0;j < sum;j++)
            if(node[j].u==u&&node[j].r==r&&node[j].d==d&&node[j].l==l)
            break;
            if(j==sum)
            {
                node[j].u=u;
                node[j].r=r;
                node[j].d=d;
                node[j].l=l;
                node[j].len++;
                sum++;
            }
            else
            node[j].len++;
        }
        dfs(0);
        if(cou)
        cout<<endl;
        cou++;
        cout<<"Game "<<cou<<": ";
        if(tag)
        cout<<"Possible"<<endl;
        else
        cout<<"Impossible"<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值