[Bfs 乱搞] BZOJ 3137 [Baltic2013]tracks

跟省选day2讲的一道题好像...

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;

inline char nc()
{
	static char buf[100000],*p1=buf,*p2=buf;
	if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
	return *p1++;
}

inline void read(int &x)
{
	char c=nc(),b=1;
	for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
	for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

inline void read(char *s){
	char c=nc(); int len=0;
	for (;c!='F' && c!='R' && c!='.';c=nc());
	for (;c=='F' || c=='R' || c=='.';s[++len]=c,c=nc()); s[++len]=0;
}

const int N=4005;

int n,m;
char Map[N][N];
int dis[N][N];

const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};

struct abcd{
	int x,y;
	abcd(int x=0,int y=0):x(x),y(y) { }
	abcd nxt(int k){ return abcd(x+dx[k],y+dy[k]); }
	char clr() { return Map[x][y]; }
};

queue<abcd> Q;

inline void bfs(abcd s)
{
	queue<abcd> q; abcd u;
	q.push(s);
	while (!q.empty()){
		u=q.front(); q.pop();
		for (int k=0;k<4;k++)
			if (u.x+dx[k]>0 && u.x+dx[k]<=n && u.y+dy[k]>0 && u.y+dy[k]<=m)
				if (u.nxt(k).clr()==u.clr() && !dis[u.x+dx[k]][u.y+dy[k]])
				{
					dis[u.x+dx[k]][u.y+dy[k]]=dis[s.x][s.y];
					q.push(u.nxt(k)); Q.push(u.nxt(k));
				}
	}
}

inline void bfs(){
	abcd u;
	Q.push(abcd(1,1)); dis[1][1]=1;
	bfs(abcd(1,1));
//	for (int i=1;i<=n;i++,putchar('\n')) for (int j=1;j<=m;j++,putchar(' ')) printf("%d",dis[i][j]); printf("\n");
	while (!Q.empty())
	{
		u=Q.front(); Q.pop();
		for (int k=0;k<4;k++)
			if (u.x+dx[k]>0 && u.x+dx[k]<=n && u.y+dy[k]>0 && u.y+dy[k]<=m)
				if (u.nxt(k).clr()!='.' && u.nxt(k).clr()!=u.clr() && !dis[u.x+dx[k]][u.y+dy[k]])
				{
					dis[u.x+dx[k]][u.y+dy[k]]=dis[u.x][u.y]+1;
					Q.push(u.nxt(k));
					bfs(u.nxt(k));
//					for (int i=1;i<=n;i++,putchar('\n')) for (int j=1;j<=m;j++,putchar(' ')) printf("%d",dis[i][j]); printf("\n");
				}
	}
}

int main()
{
	freopen("t.in","r",stdin);
	freopen("t.out","w",stdout);
	read(n); read(m);
	for (int i=1;i<=n;i++)
		read(Map[i]);
	bfs();
	int ans=0;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			ans=max(ans,dis[i][j]);
	printf("%d\n",ans);
	return 0;
}
时间: 2024-11-09 09:26:23

[Bfs 乱搞] BZOJ 3137 [Baltic2013]tracks的相关文章

【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)

4148: [AMPPZ2014]Pillars Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 100  Solved: 49 Description 给定一个n*m的矩形,其中有f个2*2的障碍物,其中任意两个障碍物中心之间的欧几里得距离至少为6, 且每个障碍物的中心到边缘的距离至少为3.请找到一条从左下角(1,1)出发经过所有没有障碍物的点各 一次的且最后回到左下角的回路. Input 第一行包含三个整数n,

【乱搞】【HNOI 2008】【bzoj 1011】遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2640 Solved: 954 Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][Discuss] Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

Codeforces 732e [贪心][stl乱搞]

/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变压器供应. 问最多能使得多少个插座与电脑匹配,使得电压一致. 如果有多种方案,输出需要变压器总数最小的那种. 输出匹配数量 输出每个插座需要接多少个变压器.输出每台电脑匹配哪个插座. 思路: 贪心 乱搞 先从小到大将插座排序,然后从地第一个插座开始,不断除以2上取整.不断找是否可以匹配.找到匹配就停

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

Bucharest, Romania 2013 H Red John Game 乱搞 未解

题意:给你一个无限的棋盘,里面有n×n的棋子,每个棋子可以跳过一个相邻(4个方向)棋子跳到下一个位置,并把他的相邻位(他跳过的那一位)删除. 解题思路:判断n%3 是否等于 0 , 原因未知. 解题代码: 1 #include<stdio.h> 2 int main(){ 3 int n ; 4 while(~scanf("%d",&n)) 5 { 6 if(n%3) 7 printf("1\n"); 8 else printf("0\

【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)

4692: Beautiful Spacing Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 21[Submit][Status][Discuss] Description 文章是一些单词组成的序列,单词由字母组成.你的任务是将一篇文章的单词填充到一个网格中,其中网格包含W列和足够多的行.为了布局之美,以下限制都需要满足. 1.文章中的文字需要按照原有的顺序放置.下图表示了将4个单词的文章“This is a pen”放入

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &