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 |
我觉得这种较复杂的东西还是用类做比较好~~~附代码# include <iostream> # include <queue> using namespace std; struct point { int lh; int ll; char col; int num; void detect(int h,int l,char col,char map[11][16]) { if(h<1||h>10||l<1||l>15) return; else if(map[h][l]!=col) return; else { this->col=col; map[h][l]=0; num++; if(l<ll||(l==ll&&h<lh)) { lh=h; ll=l; } detect(h+1,l,col,map); detect(h-1,l,col,map); detect(h,l+1,col,map); detect(h,l-1,col,map); } } }; class game { public: point list[151]; point res[151]; int count; int res_c; char map[11][16]; game(char temp[11][16]) { count=res_c=0; for(int i=10;i>=1;i--) for(int j=1;j<=15;j++) map[10-i+1][j]=temp[i][j-1]; buildlist(); } void printmap() { printf("\n\n"); for(int i=10;i>=1;i--) { for(int j=1;j<=15;j++) printf("%c",map[i][j]); printf("\n"); } printf("\n\n"); } void buildlist() { count=0; char temp[11][16]; for(int i=1;i<=10;i++) for(int j=1;j<=15;j++) temp[i][j]=map[i][j]; for(int i=1;i<=10;i++) for(int j=1;j<=15;j++) if(map[i][j]) { count++; list[count].lh=999; list[count].ll=999; list[count].num=0; list[count].detect(i,j,map[i][j],map); } for(int i=1;i<=10;i++) for(int j=1;j<=15;j++) map[i][j]=temp[i][j]; } int candel() { int lh=999,ll=999; int res=2,result=0; for(int i=1;i<=count;i++) { if(list[i].num>res||(list[i].num==res&&list[i].ll<ll)||(list[i].num==res&&list[i].ll==ll&&list[i].lh<lh)) { res=list[i].num; lh=list[i].lh; ll=list[i].ll; result=i; } } return result; } void sub_del(int h,int l,char col) { if(h<1||h>10||l<1||l>15) return; else if(map[h][l]!=col) return; else { map[h][l]=0; sub_del(h+1,l,col); sub_del(h-1,l,col); sub_del(h,l+1,col); sub_del(h,l-1,col); } } bool shiftdown() { bool flag=false; for(int i=1;i<=9;i++) for(int j=1;j<=15;j++) if(!map[i][j]&&map[i+1][j]) { map[i][j]=map[i+1][j]; map[i+1][j]=0; flag=true; } // printmap(); return flag; } bool shiftleft() { bool flag=0; for(int j=1;j<=14;j++) { bool flag1=1,flag2=0; for(int i=1;i<=10;i++) { if(map[i][j]) { flag1=0; break; } if(map[i][j+1]) flag2=1; } if(flag1&&flag2) for(int i=1;i<=10;i++) { map[i][j]=map[i][j+1]; map[i][j+1]=0; flag=1; } } // printmap(); return flag; } void del(int num) { res[++res_c]=list[num]; sub_del(list[num].lh,list[num].ll,list[num].col); // printmap(); while(shiftdown()); while(shiftleft()); buildlist(); // printmap(); } int cul() { int total=0; for(int i=1;i<=res_c;i++) total+=(res[i].num-2)*(res[i].num-2); int remain=0; for(int i=1;i<=count;i++) remain+=list[i].num; if(!remain) total+=1000; return total; } void print() { for(int i=1;i<=res_c;i++) { printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",i,res[i].lh,res[i].ll,res[i].num,res[i].col,(res[i].num-2)*(res[i].num-2)); } int remain=0; for(int i=1;i<=count;i++) remain+=list[i].num; printf("Final score: %d, with %d balls remaining.\n",cul(),remain); } }; int main() { int num; cin>>num; for(int j=1;j<=num;j++) { char temp[11][16],tt[2]; for(int i=1;i<=10;i++) for(int k=0;k<15;k++) cin>>temp[i][k]; game data(temp); int dealnum; cout<<"Game "<<j<<":"<<endl<<endl; while(dealnum=data.candel()) { data.del(dealnum); } data.print(); if(j!=num) cout<<endl; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator