ZOJ_1008_GnomeTetravex

来源:互联网 发布:淘宝机器人在哪里设置 编辑:程序博客网 时间:2024/04/30 02:31

Tetravex是什么彩色方块对对碰……

这个问题在输出上坑了一下人。

题目中

<span style="color: rgb(34, 34, 34); font-family: 'times new roman'; font-size: 17px; background-color: rgb(234, 235, 255);">Print a blank line between each game case.</span>

between……

总体感觉没什么特别的,据说不剪枝会超时。

剪枝做的就是把相同的卡片 拿出来。

#include <iostream>#include <stdio.h>using namespace std;const int M=6;int s[M*M][5];         //记录输入  s[][4]用来计入相同卡片的个数,没有相同的个数为1int re[M][M][3];       //记录答案,由于从左往右从上到下则只需要记录用过卡片的右和下 re[][][2]用来标记是否填过了int f;bool iss(int i,int n1,int n2,int n3,int n4)                   //判断卡片是否相同{    if(s[i][0]==n1&&s[i][1]==n2&&s[i][2]==n3&&s[i][3]==n4)        return 1;    else        return 0;}void dfs(int x,int y,int n){    if(f)        return;    if(x==n)    {        f=1;        return;    }    if(re[x][y][2]==1)    {        if(y<n-1)            dfs(x,y+1,n);        else            dfs(x+1,0,n);    }    else    {        for(int i=0;i<n*n;i++)        {             if(s[i][4])             {                 if(x==0&&y==0)                 {                     re[0][0][0]=s[i][1];re[0][0][1]=s[i][2];re[0][0][2]=1;                     s[i][4]--;                     dfs(x,y,n);                     re[0][0][2]=0;                     s[i][4]++;                 }                 else if(x==0&&y)                 {                     if(re[0][y-1][0]==s[i][3])                     {                         re[0][y][0]=s[i][1];re[0][y][1]=s[i][2];re[0][y][2]=1;                         s[i][4]--;                         dfs(x,y,n);                         re[0][y][2]=0;                         s[i][4]++;                     }                 }                 else if(y==0&&x)                 {                     if(re[x-1][0][1]==s[i][0])                     {                         re[x][0][0]=s[i][1];re[x][0][1]=s[i][2];re[x][0][2]=1;                         s[i][4]--;                         dfs(x,y,n);                         re[x][0][2]=0;                         s[i][4]++;                     }                 }                 else //x!=0,y!=0                 {                     if(re[x][y-1][0]==s[i][3]&&re[x-1][y][1]==s[i][0])                     {                         re[x][y][0]=s[i][1];re[x][y][1]=s[i][2];re[x][y][2]=1;                         s[i][4]--;                         dfs(x,y,n);                         re[x][y][2]=0;                         s[i][4]++;                     }                 }             }        }    }}void clears(){    for(int i=0;i<M*M;i++)            s[i][4]=0;}int main(){    int n;    int n1,n2,n3,n4;    int co=1;    while(1)    {        f=0;        scanf("%d",&n);        if(!n)            break;        for(int i=0;i<n*n;i++)        {            int sf=0;            scanf("%d%d%d%d",&n1,&n2,&n3,&n4);            for(int j=0;j<i;j++)                if(iss(j,n1,n2,n3,n4))                {                     s[j][4]++;                     sf=1;                }            if(!sf)            {                s[i][0]=n1;                s[i][1]=n2;                s[i][2]=n3;                s[i][3]=n4;                s[i][4]=1;            }        }        dfs(0,0,n);        if(co>1)                           //没有错就是这里坑人            printf("\n");        if(f)            printf("Game %d: Possible\n",co);        else            printf("Game %d: Impossible\n",co);        co++;        clears();    }    return 0;}

0 0