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 |
Re:不知道为什么WA,求教高手In Reply To:不知道为什么WA,求教高手 Posted by:lsz at 2007-09-28 03:17:19 > 我的想法是选找出各个框的左上角和右下角的顶点,然后选找出没有被覆盖的框(字母数与框上的点数一样),将这个框的字母改为*,其他框再数一下有多少字母,框上的*也做字母算,如果这个字母数与框上的点数一样,这个框就是目前最上层的。重复这个过程直到找到结果。 > > #include <iostream> > #include <algorithm> > #include <math.h> > #include <stdlib.h> > #include <stdio.h> > > using namespace std; > > char a[32][32]; > int h, w; > const int N = 5; > const char STAR = '*'; > char list[] = {'A', 'B', 'C', 'D', 'E'}; > int total[] = {12, 14, 10, 18, 24}; > int x1__[N] = {-1, -1, -1, -1, -1}; > int y1__[N] = {-1, -1, -1, -1, -1}; > int x2__[N] = {-1, -1, -1, -1, -1}; > int y2__[N] = {-1, -1, -1, -1, -1}; > char result[N]; > int ri = 1; > > > struct Node > { > int index; > int differ; > }; > > Node nodes[N]; > > bool less(Node n1, Node n2) > { > return n1.differ < n2.differ; > } > > void findBorder() > { > int i, j, index; > for(i=0; i<h; i++) > { > for(j=0; j<w; j++) > { > if(a[i][j]>='A' && a[i][j]<='E') > { > index = a[i][j] - 'A'; > if(x1__[index]<0 || j<x1__[index]) > x1__[index] = j; > if(y1__[index]<0 || i<y1__[index]) > y1__[index] = i; > if(x2__[index]<0 || j>x2__[index]) > x2__[index] = j; > if(y2__[index]<0 || i>y2__[index]) > y2__[index] = i; > } > } > } > } > > int countLetterAmount(int index) > { > int i, k, count = 0; > char c = list[index]; > > // top border > k = y1__[index]; > for(i=x1__[index]; i<x2__[index]; i++) > if(a[k][i]==c || a[k][i]==STAR) > count++; > > // bottom border > k = y2__[index]; > for(i=x1__[index]; i<x2__[index]; i++) > if(a[k][i]==c || a[k][i]==STAR) > count++; > > // left border > k = x1__[index]; > for(i=y1__[index]+1; i<y2__[index]; i++) > if(a[i][k]==c || a[i][k]==STAR) > count++; > > // right border > k = x2__[index]; > for(i=y1__[index]; i<=y2__[index]; i++) > if(a[i][k]==c || a[i][k]==STAR) > count++; > > return count; > } > > void fillStar(int index) > { > int i, k, count = 0; > char c = list[index]; > > // top border > k = y1__[index]; > for(i=x1__[index]; i<x2__[index]; i++) > if(a[k][i]==c) > a[k][i] = STAR; > > // bottom border > k = y2__[index]; > for(i=x1__[index]; i<x2__[index]; i++) > if(a[k][i]==c) > a[k][i]=STAR; > > // left border > k = x1__[index]; > for(i=y1__[index]+1; i<y2__[index]; i++) > if(a[i][k]==c) > a[i][k]=STAR; > > // right border > k = x2__[index]; > for(i=y1__[index]; i<=y2__[index]; i++) > if(a[i][k]==c) > a[i][k]=STAR; > > int j; > for(i=0; i<N; i++) > { > if(nodes[i].differ > 0) > { > j = nodes[i].index; > nodes[i].differ = total[j] - countLetterAmount(j); > //cout<<list[j]<<"\tdiffer:"<<nodes[i].differ<<"\tamount:"<<countLetterAmount(j)<<"\ttotal:"<<total[j]<<endl; > } > } > } > > void showAll() > { > int i, j; > for(i=0; i<h; i++) > { > for(j=0; j<w; j++) > cout<<a[i][j]; > cout<<endl; > } > } > > //void search(int ri) > //{ > // int i; > // if(ri < N) > // { > // for(i=1; i<N; i++) > // { > // if(nodes[i].differ == 0) > // { > // j = nodes[i].index; > // result[ri] = list[j]; > // ri++; > // fillStar(j); > // showAll(); > // nodes[i].differ--; > // } > // } > // }else > // { > // for(i=N-1; i>=0; i--) > // cout<<result[i]; > // cout<<endl; > // } > //} > > int main() > { > int i, j, count; > char str[256]; > > cin.getline(str, 80); > h = atoi(str); > > while(h != 0) > { > cin.getline(str, 80); > w = atoi(str); > > for(i=0; i<h; i++) > cin>>a[i];; > > findBorder(); > //showAll(); > //for(i=0; i<N; i++) > // cout<<list[i]<<"\t"<<x1__[i]<<","<<y1__[i]<<"\t"<<x2__[i]<<","<<y2__[i]<<endl; > > for(i=0; i<N; i++) > { > nodes[i].index = i; > nodes[i].differ = total[i] - countLetterAmount(i); > //cout<<list[nodes[i].index]<<"\t"<<nodes[i].differ<<endl; > } > sort(nodes, nodes+N, less); > //cout<<endl; > //for(i=0; i<N; i++) > // cout<<list[nodes[i].index]<<"\t"<<nodes[i].differ<<endl; > > result[0] = list[nodes[0].index]; > ri = 1; > fillStar(nodes[0].index); > //showAll(); > > while(ri < N) > { > for(i=1; i<N; i++) > { > if(nodes[i].differ == 0) > { > j = nodes[i].index; > result[ri] = list[j]; > ri++; > fillStar(j); > //showAll(); > nodes[i].differ--; > } > } > } > > for(i=N-1; i>=0; i--) > cout<<result[i]; > cout<<endl; > getchar(); > > cin.getline(str, 80); > h = atoi(str); > } > > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator