巨倒霉的!本来早写完了,MD,死了下机就全变成乱码了!搞得我都懒得再优化了。
很想看看第一名的代码。
Accepted | 1008 | C++ | 00:03.37 | 448K |
#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
}
#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
}