【宽搜】ECNA 2015 D Rings (Codeforces GYM 100825)

题目链接:

  http://codeforces.com/gym/100825

题目大意:

  给你一张N*N(N<=100)的图表示一个树桩,‘T‘为年轮,‘.‘为空,求每个‘T‘属于哪一圈年轮,空的为‘.‘,如果最内圈<10,每个格子用两位表示,否则用三位,不足的用‘.‘补足。

题目思路:

  【宽搜】

  初始所有点标记为INF,先将图上所有的‘.‘标记为0,边缘如果有‘T‘记为1,并把‘.‘和边缘所有的点加入队列,接下来一个一个上下左右扩展并更新答案,没进队的进队。最后输出。

  1 //
  2 //by coolxxx
  3 //#include<bits/stdc++.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<map>
  9 #include<stack>
 10 #include<queue>
 11 #include<set>
 12 #include<bitset>
 13 #include<memory.h>
 14 #include<time.h>
 15 #include<stdio.h>
 16 #include<stdlib.h>
 17 #include<string.h>
 18 //#include<stdbool.h>
 19 #include<math.h>
 20 #define min(a,b) ((a)<(b)?(a):(b))
 21 #define max(a,b) ((a)>(b)?(a):(b))
 22 #define abs(a) ((a)>0?(a):(-(a)))
 23 #define lowbit(a) (a&(-a))
 24 #define sqr(a) ((a)*(a))
 25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
 26 #define mem(a,b) memset(a,b,sizeof(a))
 27 #define eps (1e-10)
 28 #define J 10000
 29 #define mod 1000000007
 30 #define MAX 0x7f7f7f7f
 31 #define PI 3.14159265358979323
 32 #pragma comment(linker,"/STACK:1024000000,1024000000")
 33 #define N 104
 34 #define M 10004
 35 using namespace std;
 36 typedef long long LL;
 37 double anss;
 38 LL aans;
 39 int cas,cass;
 40 int n,m,lll,ans;
 41 int q[M][2];
 42 int a[N][N];
 43 bool u[N][N];
 44 char s[N][N];
 45 void spfa()
 46 {
 47     int x,y,l=0,r=cas;
 48     while(l!=r)
 49     {
 50         x=q[l=(l+1)%M][0],y=q[l][1];
 51         cass=max(cass,a[x][y]);
 52         u[x][y]=0;
 53         if(x+1<=n && a[x+1][y]>a[x][y]+1)
 54         {
 55             q[r=(r+1)%M][0]=x+1,q[r][1]=y;
 56             u[x+1][y]=1;
 57             a[x+1][y]=a[x][y]+1;
 58         }
 59         if(y+1<=m && a[x][y+1]>a[x][y]+1)
 60         {
 61             q[r=(r+1)%M][0]=x,q[r][1]=y+1;
 62             u[x][y+1]=1;
 63             a[x][y+1]=a[x][y]+1;
 64         }
 65         if(x-1>0 && a[x-1][y]>a[x][y]+1)
 66         {
 67             q[r=(r+1)%M][0]=x-1,q[r][1]=y;
 68             u[x-1][y]=1;
 69             a[x-1][y]=a[x][y]+1;
 70         }
 71         if(y-1>0 && a[x][y-1]>a[x][y]+1)
 72         {
 73             q[r=(r+1)%M][0]=x,q[r][1]=y-1;
 74             u[x][y-1]=1;
 75             a[x][y-1]=a[x][y]+1;
 76         }
 77     }
 78 }
 79 int main()
 80 {
 81     #ifndef ONLINE_JUDGE
 82 //    freopen("1.txt","r",stdin);
 83 //    freopen("2.txt","w",stdout);
 84     #endif
 85     int i,j,k;
 86     int x,y,z;
 87 //    init();
 88 //    for(scanf("%d",&cass);cass;cass--)
 89 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
 90 //    while(~scanf("%s",s))
 91     while(~scanf("%d",&n))
 92     {
 93         cas=0;cass=0;mem(u,0);mem(a,MAX);
 94         scanf("%d",&m);
 95         for(i=1;i<=n;i++)
 96         {
 97             scanf("%s",s[i]+1);
 98             for(j=1;j<=m;j++)
 99             {
100                 if(s[i][j]==‘.‘)
101                 {
102                     q[++cas][0]=i,q[cas][1]=j;
103                     a[i][j]=0;
104                 }
105                 else if(i==1 || i==n || j==1 || j==m)
106                 {
107                     q[++cas][0]=i,q[cas][1]=j;
108                     a[i][j]=1;
109                 }
110             }
111         }
112         spfa();
113         /*
114         for(i=1;i<=n;i++)
115         {
116             for(j=1;j<=m;j++)
117                 printf("%d ",a[i][j]);
118             puts("");
119         }
120         */
121         if(cass<10)
122         {
123             for(i=1;i<=n;i++)
124             {
125                 for(j=1;j<=m;j++)
126                 {
127                     printf(".");
128                     if(a[i][j]==0)printf(".");
129                     else printf("%d",a[i][j]);
130                 }
131                 puts("");
132             }
133         }
134         else
135         {
136             for(i=1;i<=n;i++)
137             {
138                 for(j=1;j<=m;j++)
139                 {
140                     printf(".");
141                     if(a[i][j]==0)printf("..");
142                     else if(a[i][j]<10)printf(".%d",a[i][j]);
143                     else printf("%d",a[i][j]);
144                 }
145                 puts("");
146             }
147         }
148
149     }
150     return 0;
151 }
152 /*
153 //
154
155 //
156 */

时间: 2024-10-21 20:02:23

【宽搜】ECNA 2015 D Rings (Codeforces GYM 100825)的相关文章

【模拟】ECNA 2015 I What&#39;s on the Grille? (Codeforces GYM 100825)

题目链接: http://codeforces.com/gym/100825 题目大意: 栅栏密码.给定N(N<=10),密钥为一个N*N的矩阵,'.'代表空格可以看到,'X'代表被遮挡,还有密文字符串S,长度为N*N 每次将这个矩阵顺时针旋转90°,把矩阵中空格对应的位置按照从上到下从左到右的顺序依次填充上密文字符,求最终这个密文字符能否填满N*N的矩阵,能按顺序输出得到的答案,不能输出"invalid grille" 题目思路: [模拟] 直接模拟即可.旋转的坐标公式很好推.

Codeforces gym Hello 2015 Div1 B and Div2 D

Codeforces gym 100571 problem D Problem 给一个有向图G<V,E>和源点S,边的属性有长度L和颜色C,即E=<L,C>.进行Q次询问,每次给定一个点X,输出S到X的最短路的长度(不存在则输出 -1).但要求S到X的路径中相邻两条边颜色不一样. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 |V|, |E|: [1, 10^5] X, S: [1, |V| ] L: [1, 10^9] |C|

Codeforces gym Hello 2015 Div1 E

Codeforces gym 100570 problem E (一种处理动态最长回文子串问题的方法) Problem 给一个长度为N的字符串S,字符集是'a'-'z'.进行Q次操作,操作分三种.一,修改位置X的字符为C:二,查询以P位置为中心的最长回文子串的长度,并输出:三,查询以P与P+1的中间位置为中心的最长回文子串的长度,并输出. More 第二种操作子串长度为奇数,一定存在:第三种操作子串长度为偶数,若不存在,输出 -1. Limits Time Limit(ms): 4000(1s足

Codeforces gym Hello 2015 Div1 C and Div2 E

Codeforces gym 100570 problem C Codeforces gym 100571 problem E Problem 给一个N行M列的矩阵Ma,进行Q次(Q<=10)查询,每次给定一个K,问有多少子矩阵,满足最大值max - 最小值min <=K. Limits Time Limit(ms): 8000 Memory Limit(MB): 512 N, M: [1, 400] Q: [1, 10] Ma(i, j), K: [1, 10^9] Solution (Th

Codeforces gym Hello 2015 Div2 B

Codeforces gym 100571 problem B Problem 设函数F(x),F(1)与F(2)已知,且当 i>=3,F(i)=a*F(i-2)+b*F(i-1).再给一个长度为N的数列A,进行Q次如下操作:每次给一个区间[L, R],对于每个k(L=<k<=R),将A[k]=A[k]+F[k-L+1].最后输出数列A(mod 10^9+7). Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N, Q: [1, 10^

POJ 2251宽搜、

因为这个题做了两次犯了两次不同的错误. 第一次用的dfs死活都超时 第二次把定义队列定义在了全局变量的位置,导致连WA了几次.最后找到原因的我真的想一巴掌拍死自己 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 const int qq=40; 6 int vis[qq][qq][qq]; 7 char map[qq][qq][qq]; 8 int tz,

宽搜--knight moves hdu1372

写出来之后觉得是一道简单的宽搜题,但是之前写的时候遇到很多细节处理的小问题.刚刚开始,还需要更加努力. 首先是题目意思,骑士移动原来是走日字,智商捉急. 其次是方向处理问题,之前一直没转过弯.普遍方向表达有两种 第一种: int h[8][2]={{-2,-1},{-2,1},{-1,2},{-1,-2},{1,-2},{1,2},{2,-1},{2,1}}; for(int i=0;i<8;i++){ next.a=head.a+h[i][0]; next.b=head.b+h[i][1];

【NOIP2016提高组】愤怒的小鸟(状压宽搜)

题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如的曲线,其中a,b是Kiana指定的参数,且必须满足a<0. 当小鸟落回地面(即x轴)时,它就会瞬间消失. 在游戏的某个关卡里,平面的第一象限中有n只绿色的小猪,其中第i只小猪所在的坐标为(xi,yi). 如果某只小鸟的飞行轨迹经过了(xi,yi),那么第i只小猪就会被消灭掉,同时小鸟将会沿着原先

【图论】【宽搜】【染色】NCPC 2014 A Ades

题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1787 题目大意: N个点M条无向边(N,M<=200000),一个节点只能有一个标记.每条边有一个值{0,1或2}表示这条边连接的两个节点拥有的标记之和.问只要要多少个标记才能满足,无解impossible. 题目思路: [图论][宽搜] 因为每个点只能有或没有标记.所以可以枚举每个联通块的其中一个点有还是没有标记,用这个点去拓展这个点的联通块并01染色(这个点所能到达的所有点) 初