| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哪里有数据来解救劳苦的代码呀?wa了半天,附代码。用了一下并查集
#include <cstdio>
#include <string.h>
using namespace std;
int father[2250],count[2250];
int findfather(int a){return father[a]==-1?a:father[a]=findfather(father[a]);}
void together(int a,int b){int i,j;if ((i=findfather(a))!=(j=findfather(b))){
if (i%15<j%15 || (i%15==j%15 && i/15>j/15)){father[j]=i;count[i]+=count[j];}
else {father[i]=j;count[j]+=count[i];}
}}
char map[150][15];
int score,ball,H,pX,pY;
int workout(int &id)
{
int i,j,maxid;
memset(father,0xff,sizeof(father));
for (i=0;i<H*15;i++)count[i]=1;
for (i=0;i<H;i++)for (j=0;j<15;j++)if (map[i][j]){
if (i>0 && map[i-1][j]==map[i][j])together(i*15+j,i*15+j-15);
if (j>0 && map[i][j-1]==map[i][j])together(i*15+j,i*15+j-1);
if (j+1<15 && map[i][j+1]==map[i][j])together(i*15+j,i*15+j+1);
if (i+1<H && map[i+1][j]==map[i][j])together(i*15+j,i*15+j+15);
}
for (maxid=i=0;i<H*15;i++)if (father[i]==-1 && map[i/15][i%15])
if (count[i]>count[maxid] || (count[i]==count[maxid] && (i%15<maxid%15 || (i%15==maxid%15 && i/15>maxid/15))))maxid=i;
if (count[maxid]<=1)return 0;
ball-=count[maxid];score+=(count[maxid]-2)*(count[maxid]-2);
pX=maxid/15;pY=maxid%15;
printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",
id, H-pX,pY+1, count[maxid], map[pX][pY],(count[maxid]-2)*(count[maxid]-2));
return ++id;
}
int nextmap()
{
int i,k,l,p,q;
char j;
q=findfather(pX*15+pY);
for (i=0;i<H*15;i++)if (findfather(i)==q)map[i/15][i%15]=0;
for (i=0;i<15;i++)for (k=l=H-1;k>=0;k--) if (map[k][i]){
j=map[k][i];map[k][i]=map[l][i];map[l][i]=j;
l--;
}
for (i=k=0;i<15;i++){
for (l=0;l<H && map[l][i]==0;l++);
if (l!=H){
for (p=0;p<H;p++){
j=map[p][i];map[p][i]=map[p][k];map[p][k]=j;
}
k++;
}
}
/*for (k=0;k<H;k++){for (l=0;l<15;l++)
printf("%c",(map[k][l]==0?' ':map[k][l]));printf("\n");
}*/
return 0;
}
int main()
{
int TT,T,i,j;
char chs[500];
scanf("%d",&T);TT=T;
gets(chs);
while (T--){
printf("Game %d:\n\n",TT-T);
score=0;H=10;
for (i=0;i<H;i++){gets(chs);
for (j=0;j<15;j++)map[i][j]=chs[j];
}
if (T)gets(chs);
i=1;
for (ball=H*15;workout(i);nextmap());
if (ball==0)score+=1000;
printf("Final score: %d, with %d balls remaining.\n\n",score,ball);
}
getchar();getchar();getchar();
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator