HCOJ 1001 Jewelry(搜索)

View Code
  1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4
5 char map[14][7];
6 bool isw[14][7];
7 bool f;
8 char newc[3];
9 int m;
10 int dir[8][8]={
11 {0,-1},{0,1},{-1,-1},{1,1},
12 {-1,0},{1,0},{-1,1},{1,-1}
13 };
14
15 void addnew()
16 {
17 int i,j,k;
18 for(i=12;i>=0;--i)
19 if(map[i][m-1] == 'W')break;
20 for(j=i,k=2;j>=i-2;--j,--k)
21 map[j][m-1]=newc[k];
22 }
23
24 void drop()
25 {
26 int i,j;
27 for(j=0;j<6;++j)
28 {
29 int x = 12;
30 for(i=x;i>=0;--i)
31 {
32 if(isw[i][j])continue;
33 map[x--][j]=map[i][j];
34 }
35 for(i=x;i>=0;--i)
36 map[i][j]='W';
37 }
38 }
39
40 void search()
41 {
42 int i,j,k,x;
43 f= true;
44 for(i=0;i<13;++i)
45 for(j=0;j<6;++j)
46 isw[i][j]= false;
47 for(i=0;i<13;++i)
48 for(j=0;j<6;++j)
49 {
50 if(map[i][j] != 'W')
51 {
52 for(k=0;k<8;k+=2)
53 {
54 int l=1,r=1;
55 while( i+l*dir[k][0]>=0 && i+l*dir[k][0]<13
56 && j+l*dir[k][1] >=0 && j+l*dir[k][1]<6
57 && map[i+l*dir[k][0]][j+l*dir[k][1]]==map[i][j]
58 )l++;
59 while( i+r*dir[k+1][0]>=0 && i+r*dir[k+1][0]<13
60 && j+r*dir[k+1][1]>=0 && j+r*dir[k+1][1]<6
61 && map[i+r*dir[k+1][0]][j+r*dir[k+1][1]]==map[i][j])r++;
62 if(l+r-1>=3)
63 {
64 for(x=0;x<l;++x)
65 isw[i+x*dir[k][0]][j+x*dir[k][1]]=true;
66 for(x=1;x<r;++x)
67 isw[i+x*dir[k+1][0]][j+x*dir[k+1][1]]=true;
68 f=false;
69 }
70
71 }//for(k)
72
73 }//if(map[i][j])
74 }//for(j)
75 if(false == f)drop();
76 }
77
78 int main()
79 {
80 int t,i,j;
81 cin>>t;
82 while(t--)
83 {
84 for(i=0;i<13;++i)
85 cin>>map[i];
86 for(i=0;i<3;++i)
87 cin>>newc[i];
88 cin>>m;
89 addnew();
90 f = true;
91 while(1)
92 {
93 search();
94 if(f)break;
95 }
96 for(i=0;i<13;++i)
97 cout<<map[i]<<endl;
98 }
99 system("pause");
100 return 0;
101 }

 

posted @ 2012-04-02 19:58  知行执行  阅读(8232)  评论(0编辑  收藏  举报