problem 1008

 巨倒霉的!本来早写完了,MD,死了下机就全变成乱码了!搞得我都懒得再优化了。

很想看看第一名的代码。

Accepted1008C++00:03.37448K
#include<stdio.h>
#include
<string.h>
struct  st
{
    
int
 t,r,b,l;
    
int
 cnt;
}square[
25
];
int n,cnt,map[5][5
],k,res;
#ifndef ONLINE_JUDGE
int
 testnum;
#endif

void dfs(int  step)
{
    
if(res == 1)    return
;
    
int row = step /
 n;
    
int col = step %
 n;
    
int right = -1,bottom = -1
;
    
if(row > 0)    bottom = square[map[row - 1
][col]].b;
    
if(col > 0) right = square[map[row][col - 1
]].r;
    
for(int i = 0; i < k; i++
)
    {
        
if(square[i].cnt > 0 && (bottom == -1 || square[i].t == bottom) && (right == -1 || square[i].l ==
 right))
        {
#ifndef ONLINE_JUDGE
            testnum
++
;
#endif

            
if(step == cnt - 1 )
            {
                res 
= 1
;
                
return
;
            }
            map[row][col] 
=
 i;
            square[i].cnt
--
;
            dfs(step 
+ 1
);
            square[i].cnt
++
;
            map[row][col] 
= -1
;
        }
    }
}
void
 solve()
{
    
if(n == 1
)
    {
        printf(
"Possible/n"
);
        scanf(
"%*d%*d%*d%*d"
);
        
return
;
    }
    memset(map,
0xffff,sizeof
(map));
    memset(square,
0,sizeof
(square));
    res 
= k = 0
;
    cnt 
= n *
 n;
    
char flag[10][10][10][10
];
    memset(flag,
-1,sizeof
(flag));
    
for(int i = 0,t,r,l,b; i < cnt; i++
)
    {
        scanf(
"%d%d%d%d",&t,&r,&b,&
l);
        
int
 j;
        
if(flag[t][r][b][l] >= 0
)
            square[flag[t][r][b][l]].cnt
++
;
        
else

        {
            square[k].t 
= t, square[k].r = r, square[k].b = b, square[k].l = l,square[k].cnt = 1 ;
            flag[t][r][b][l] 
= k++
;
        }
    }
    dfs(
0
);
    res 
== 0 ? printf("Impossible/n") : printf("Possible/n"
);
}
int
 main()
{
#ifndef ONLINE_JUDGE
    freopen(
"1008.txt","r"
,stdin);
    testnum 
= 0
;
#endif

    
int t = 0 ;
    
while(scanf("%d",&n) != EOF && n != 0
)
    {
        
if(t > 0)    printf("/n"
);
        printf(
"Game %d: ",++
t);
        solve();
    }
#ifndef ONLINE_JUDGE
    printf(
"[%d]/n",testnum);//5872

    fclose(stdin);
#endif

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值