FZU 2150 求双搜最优解

http://acm.fzu.edu.cn/problem.php?pid=2150

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<vector>
#include<string.h>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<sstream>
#include<time.h>
#include<utility>
#include<malloc.h>

using namespace std;

int t, n, m;
char b[15][15];
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, 1 }, { 0, -1 } };
int vis[15][15];
int check(int x, int y)
{
	if (x >= 0 && x < n && y >= 0 && y < m)
		return 1;
	return 0;
}
struct node
{
	int x;
	int y;
	int t;
}q[150];

queue<node> de;
int step = 0;

int main()
{
	scanf("%d",&t);
	int c = 1;
	while (t--)
	{
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n; i++)
			scanf("%s",b[i]);

		int num = 0;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
			{
				if (b[i][j] == '#')
				{
					q[num].x = i;
					q[num++].y = j;
				}
			}

		int ans = 0x3f3f3f3f;
		if (num == 2)
			ans = 0;
		else
		for (int i = 0; i < num; i++)
		{
			for (int j = i; j < num; j++)
			{
				int sx = q[i].x;
				int sy = q[i].y;
				int ex = q[j].x;
				int ey = q[j].y;
				{

					while (!de.empty()) de.pop();

					node qq, qqq;
					qq.x = sx; qq.y = sy; qq.t = 0;
					qqq.x = ex; qqq.y = ey; qqq.t = 0;

					de.push(qq);
					de.push(qqq);
					memset(vis,0,sizeof(vis));

					vis[sx][sy] = vis[ex][ey] = 1;

					step = 0;

					/////////////////
					while (!de.empty())
					{
						node qq = de.front();
						de.pop();
							step = qq.t;
						for (int i = 0; i < 4; i++)
						{
							int x = qq.x + dir[i][0];
							int y = qq.y + dir[i][1];

							if (!check(x, y) || vis[x][y] || b[x][y] == '.')
								continue;
							node qqq;
							qqq.x = x;
							qqq.y = y;
							qqq.t = qq.t + 1;
							vis[x][y] = 1;
							de.push(qqq);
						}
					}
					////////////////
					int ok = 1;

					for (int i = 0; i < n; i++)
					{
						for (int j = 0; j < m; j++)
						{
							if (vis[i][j] == 0 && b[i][j] == '#')
							{
								ok = 0;
								break;
							}
						}
					}

					if (ok)
					{
						ans = min(ans, step);
					}
				}
			}
		}
		if (ans == 0x3f3f3f3f)
			ans = -1;
		printf("Case %d: %d\n",c++,ans);
	}
}
时间: 2024-09-28 21:10:39

FZU 2150 求双搜最优解的相关文章

ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪

FZU 2150 Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this boar

FZU 2150 Fire Game(点火游戏)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h2 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 18.0000pt } h3 {

FZU 2150 Fire Game --两点同步搜索

枚举两点,然后同步BFS,看代码吧,很容易懂的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #define Mod 1000000007 using namespace std; struct Po

FZU 2150 Fire Game (暴力BFS)

[题目链接]click here~~ [题目大意]: 两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的.问你最少花多少时间可以烧掉,如果烧不掉就输出-1 [解题思路]: 数据比较弱的情况下直接暴力枚举每块草坪上可以放的位置,比较高端的写法目前没有想到,以后想到了文章更新下~~ ps:由于一个细节没注意,导致WA了几乎一页,还以为FZU 判题出错了,后来突然发现每次从队列里拿出队首的元素,才是

求双连通分量的详解。(根据刘汝佳的训练指南p314)

无向图的双连通分量 点-双连通图:一个连通的无向图内部没有割点,那么该图是点-双连通图.         注意:孤立点,以及两点一边这两种图都是点-双连通的.因为它们都是内部无割点. 边-双连通图:一个连通的无向图内部没有桥,那么该图就是边-双连通的.         注意:孤立点是边-双连通的,但是两点一边不是边-双连通的. 由上面定义可以知道:点-双连通图不一定是边-双连通的. 对于一张无向图,点-双连通的极大子图称为双连通分量.不难发现,每条边恰好属于一个双连通分量(所以两点一边是一个点-

(FZU 2150) Fire Game (bfs)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150 Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this board is consisting of grass or just empty a

fzu 2150(bfs)

 Problem 2150 Fire Game Accept: 693    Submit: 2657 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each gri

poj3352 road construction tarjan求双连通分量

填坑--链接:http://poj.org/problem?id=3352 题意:求出图中再加上几条边会全部边双连通. 思路大概就是求出图中所有的双连通分量,然后像$SCC$一样缩点,缩完后每两个双连通分量再连边即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn

[MATLAB] 利用遗传算法函数求目标函数的最优解

最近接触到了遗传算法以及利用遗传算法求最优解,所以就把这些相关的内容整理记录一下. 一.遗传算法简介(摘自维基百科) 遗传算法(英语:genetic algorithm (GA))是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等. 算法 选择初始生命种群 循环 评价种群中的个体适应度 以比例原则(分数高的挑中概率也较高)选择产生下一个种群. 改变该种群(交叉和变异) 直到停止循环的条件满足