湖南多校对抗赛(csu 1560)

简单的bfs搜索题,对每个初始的水滴依次扩展,当达到规定步数时跳出。这题还是有坑点的,对于每个初始的水滴,已经访问过的位置不再访问,但是对于不同的水滴,别的水滴已经访问过的,对于当前水滴来说可能还要访问,才能使扩展的范围最大。

#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
    int a;
    int b;
    int step;
}N[104];
int vis[2000][2000];
int x,y,t,l,w;
int x1,x2,yy1,y2;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};

void bfs(int bx,int by,int mark)
{
    node k;
    queue<node> q;
    k.a=bx,k.b=by,k.step=0;
    q.push(k);
    while(!q.empty())
    {
        node temp=q.front();
        q.pop();
        if(temp.step>=t)//时间够了,跳出
        return ;
        for(int i=0;i<4;i++)
        {
            node cur;
            int xx=temp.a+dir[i][0];
            int yy=temp.b+dir[i][1];
            if(xx>=1&&xx<=x&&yy>=1&yy<=y&&(vis[xx][yy]!=-1&&vis[xx][yy]!=mark))
            {
                cur.a=xx,cur.b=yy;
                cur.step=temp.step+1;
                if(cur.step>=t)
                return ;
                else
                {
                   q.push(cur);
                   vis[xx][yy]=mark;//当前水源下不要走重复的
                }
            }

        }
    }
}
int main()
{
    while(cin>>x>>y>>t>>l>>w)
    {
        if(x==-1)
        break;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=l;i++)
        cin>>N[i].a>>N[i].b;
        for(int i=1;i<=w;i++)
        {
            cin>>x1>>yy1>>x2>>y2;
            //将墙附为-1
            if(x1==x2)
            {
                if(yy1>y2)
                swap(yy1,y2);
                for(int j=yy1;j<=y2;j++)
                {
                    vis[x1][j]=-1;
                }
            }
            else if(yy1==y2)
            {
                if(x1>x2)
                swap(x1,x2);
                for(int j=x1;j<=x2;j++)
                vis[j][yy1]=-1;
            }
            else if(x1<x2)
            {
                if(yy1>y2)
                {
                    for(int j=x1;j<=x2;j++)
                    vis[j][yy1--]=-1;
                }
                else if(yy1<y2)
                {
                    for(int j=x1;j<=x2;j++)
                    vis[j][yy1++]=-1;
                }
            }
            else if(x1>x2)
            {
                if(yy1<y2)
                {
                    for(int j=x2;j<=x1;j++)
                    vis[j][y2--]=-1;
                }
                else if(yy1>y2)
                {
                    for(int j=x2;j<=x1;j++)
                    vis[j][y2++]=-1;
                }
            }

        }
        for(int i=1;i<=x;i++)
        {
            for(int j=1;j<=y;j++)
            cout<<vis[i][j]<<" ";
            cout<<endl;
        }
            for(int i=1;i<=l;i++)
            {
                vis[N[i].a][N[i].b]=1;
                bfs(N[i].a,N[i].b,i);//多个水滴
            }
            int ans=0;
            for(int i=1;i<=x;i++)
            for(int j=1;j<=y;j++)
            {
                if(vis[i][j]>=1&&vis[i][j]<=l)
                ans++;
            }
            cout<<ans<<endl;
    }
    return 0;
} 
时间: 2024-10-13 01:05:56

湖南多校对抗赛(csu 1560)的相关文章

湖南多校对抗赛3.28 J - Jerry&#39;s trouble

Problem J: Jerry's trouble Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 96  Solved: 46 [Submit][Status][Web Board] Description Jerry is caught by Tom. He was penned up in one room with a door, which only can be opened by its code. The code is the

湖南多校对抗赛(2015.4.6)CSU 1561~1569 题解

A:点击打开链接 CSU 1561 (More)Multiplication 题意:把两个数的乘积每个位置的结果填充上去. 注意这个矩阵最大是1e8,所以不能开数组. 模拟题 #include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue

湖南多校对抗赛(2015.05.10)(国防科大学校赛决赛-Semilive)CSU1609-1618

简单地写个题解,毕竟总个结很重要.但是由于题目水 + 不会写题解,路过的大牛莫喷... 题A 题意:给你两个序列a和b,有一种操作,对于一个数(非头尾)v,左边加上v,右边加上v,自己变成-v,然后问a操作无数次可不可以变成b? 题解:这题我学会了一个分析题目的方法:从目标逆着推.对于两个一样的序列,如下 操作前:……(i - 1) (i) (i + 1) …… 操作后:……(i - 1) + (i) (i) - (i) - (i) (i + 1) + (i)…… 定义si为前i项的和,假设原序

湖南多校对抗赛(2015.03.28)CSU1547~1536 题解

比赛链接:点击打开链接 A:点击打开链接 题意: 有2种矩阵1*x和2*x, 用最小的矩阵2*m来把这些框住,使得m最小,输出最小的m 输入: n个矩阵 下面n行给出wi, xi, wi的取值只有1,2两种,且矩阵不能旋转重叠. 思路: 矩阵宽为2就直接加到答案上,所以只考虑矩阵宽为1. dp[i]表示第一行能放的宽度,类似背包求出这个dp 然后if(dp[i] is ok) ans = min(ans, max(sum-i, i) ); #include <iostream> #includ

湖南多校对抗赛(2015.03.28) E Longest Increasing Subsequence Again

题意:给你一个序列,问你删除掉连续的一段,使得剩下的序列的最长上升字串最大,问你这个最大值. 解题思路:分段dp,  dp[i][0] ,dp[i][1]   , 0表示前面没有切过,只能从前一个数的0状态得到,1状态表示前面已经切过了,能从前一个的1状态得到,也能从 在他前面的比他值小的dp[j][0](j < i && a[j] < a[i])的最大值得到,这里用线段树维护就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkd

湖南多校对抗赛(2015.03.28) G Good subsequence

题意:找到一个序列中极值<=k的最长字串的长度. 解题思路:set容器双递推. 解题代码: 1 // File Name: g.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时04分39秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque>

湖南多校对抗赛(2015.03.28) A Rectangle

题意:给你一些最多宽为2 的木板,让你放在一个宽为二的盒子里面,问你这个盒子最短有多长. 解题思路:DP,离中间最近的那个值. 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时13分56秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9

湖南多校对抗赛(2015.03.28) B Design road

题意:给你起点(0,0),终点(x,y),中间有很多条河, 在河上面建桥花费c1,在陆地建路花费c2,问你最小花费是多少. 解题思路:我们知道,我们考虑的时候完全可以把河都移动到一边来求,这样只需要三分就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 13时26分39秒 4 5 #include<vector> 6 #include<list> 7 #

湖南多校对抗赛(2015.03.28) H SG Value

题意:给你一个集合,动态插入 ,动态询问,然后问你这个集合的sg值(这个集合用加法运算不能产生的那个最小正整数)是多少. 解题思路:假设我们现在的这个SG值是 x 1)现在插入集合里面一个数v   如果这个v > x ,那么显然  sg值x不变,  把v放进从小到大的优先队列中 2)如果这个 v <= x 那么sg值x肯定就会变成  x + v, 每更新一次 sg值,就去看优先队列top元素是否是 小于等于 x的 ,如果小于等于,其实就等于把这个top元素进行1操作,这样就不会错了. 解题代码