中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)

题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2721

题意: 给定n个左标,跟那n个坐标相同的 且3个以上的消失,圈都 靠下, 而且 如果一整列都没有的话,就都往左靠。。。。

思路:比赛的时候没调试完,,,, 最坑爹的是,用后台数据测试都对了,结果还是wrong, 经过鑫哥指导。。。那些字符要以字符串的形式输入,

否则会wrong ,后台的原因不知道为什么。。。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <queue>
  5 using namespace std;
  6 
  7 int dx[5]= {1,-1,0,0};
  8 int dy[5]= {0,0,1,-1};
  9 char G[20][20],map[20][20];
 10 struct node
 11 {
 12     int x,y;
 13 }a[100];
 14 
 15 struct point
 16 {
 17     int x,y;
 18 }pos,next;
 19 void bfs(int x1,int y1)
 20 {
 21     int i,j,k,count=0;
 22     int vis[20][20];
 23     char ch;
 24     char f;
 25     f='a';
 26     memset(vis,0,sizeof(vis));
 27     ch=G[x1][y1];
 28     queue<point>q;
 29     next.x=x1;
 30     next.y=y1;
 31     vis[x1][y1]=1;
 32 
 33     q.push(next);
 34     while(!q.empty())
 35     {
 36         pos=q.front();
 37         q.pop();
 38         count++;
 39         for(i=0; i<4; i++)
 40         {
 41             next.x=pos.x+dx[i];
 42             next.y=pos.y+dy[i];
 43             if(!vis[pos.x+dx[i]][pos.y+dy[i]]&&G[pos.x+dx[i]][pos.y+dy[i]]==ch&&
 44                     pos.x+dx[i]>=1&&pos.x+dx[i]<=10&&pos.y+dy[i]>=1&&pos.y+dy[i]<=12)
 45             {
 46                 vis[pos.x+dx[i]][pos.y+dy[i]]=1;
 47                 q.push(next);
 48             }
 49         }
 50     }
 51     if(count>=3)//刚开始 没看到这句with a cluster of 3 or more circles, 
 52     {
 53         for(i=1; i<=10; i++)
 54         for(j=1; j<=12; j++)
 55         if(vis[i][j]==1)
 56         G[i][j]=f;
 57     }
 58     for(i=1; i<=10; i++)
 59     {
 60         for(j=11; j>=1; j--)//一定要倒着来,因为这个调试了好长时间。。。
 61         {
 62             if(G[i][j]==f)
 63             {
 64                 for(k=j; k<=11; k++)
 65                 {
 66                     G[i][k]=G[i][k+1];
 67                     G[i][k+1]=f;
 68                 }
 69             }
 70         }
 71     }
 72     for(i=10; i>=1; i--)//一定要倒着来,因为这个调试了好长时间。。。
 73     {
 74         if(G[i][1]==f)
 75         {
 76             for(j=i; j<=9; j++)
 77                 for(k=1; k<=12; k++)
 78                 {
 79                     G[j][k]=G[j+1][k];
 80                     G[j+1][k]=f;
 81                 }
 82         }
 83     }
 84 }
 85 int main()
 86 {
 87     int n,i,j,sum;
 88     char ch;
 89     char f;
 90     f='a';
 91     while(scanf("%d%*c",&n)!=EOF&&n)
 92     {
 93         sum=0;
 94         memset(G,0,sizeof(G));
 95         memset(map,0,sizeof(map));
 96 
 97         for(i=12; i>=1; i--)
 98         cin>>map[i];
 99 
100         for(i=12; i>=1; i--)
101         {
102             for(j=1; j<=10; j++)
103             G[j][i]=map[i][j-1];
104         }
105         for(i=0; i<n; i++)
106         {
107              cin>>ch>>a[i].y;
108             a[i].x=ch-96;
109             if(G[a[i].x][a[i].y]!=f)
110             bfs(a[i].x,a[i].y);
111         }
112         for(i=1; i<=10; i++)
113             for(j=1; j<=12; j++)
114                 if(G[i][j]!=f)
115                     sum++;
116 
117         printf("%d\n",sum);
118     }
119     return 0;
120 }

 

转载于:https://www.cnblogs.com/bfshm/p/3453005.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值