zoukankan      html  css  js  c++  java
  • 【题解】狼和羊-C++

    Description
    米基家的后院养着一群羊,米基由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符‘?’表示空地,‘#’表示栅栏,‘o’表示羊,‘v’表示狼,羊和狼所在的格子都是空地。如果从一个空地A沿着水平方向或垂直方向经过一系列的空地能够到达空地B,则称空地A和空地B属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。写一个程序统计战斗结束后所有羊圈中羊的总数和狼的总数。
    Input
    第一行包含两个用空格隔开的自然数R和C,其中3<=R,C<=250,R表示米基家后院的行数,C表示列数,接下来的R行
    每行包含C个字符,每个字符表示一个格子的情况。
    Output
    仅一包含两个用一个空格隔开的整数,表示要求的羊的数量和狼的数量。
    Sample Input

    9 12
    .###.#####..
    #.oo#...#v#.
    #..o#.#.#.#.
    #..##o#...#.
    #.#v#o###.#.
    #..#v#....#.
    #...v#v####.
    .####.#vv.o#
    .......####.
    
    

    Sample Output

    3 5
    

    这道题目emm,虽然是BFS的 水 题,但是有一个点卡了我很久。
    最开始我的代码总是TLE,找机房大佬来看也看不出什么不对,大概思路是这样的:

    输入->遍历一遍图,找到不是#的就bfs->bfs计这一片的羊和狼的数量->把相邻的不是#的都变成#->统计输出

    最后才发现,我的代码里面计数并变成#的这一板块是放在bfs里while的开头,也就是当处理队头的时候才计数变#,所以就TLE,…
    然后把这一块改到打进队列的时候操作,居然就 24ms 水过去了!
    代码不规范,WA两行泪!
    下面就是代码部分emm

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int lang,yang;//awa
    char mp[258][258];
    struct node
    {
    	int x,y;
    };
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    void bfs(int x,int y)
    {
    	int nl=0,ny=0;//now_lang,now_yang
    	queue<node> q;
    	q.push((node){x,y});
    	if(mp[x][y]=='o')ny++;
    	else if(mp[x][y]=='v')nl++;
    	mp[x][y]='#';
    	while(!q.empty())
    	{
    		node now=q.front();
    		q.pop();
    		for(int i=0;i<4;i++)
    		{
    			int tx=now.x+dir[i][0],ty=now.y+dir[i][1];
    			if(mp[tx][ty]!='#'&&1<=tx&&tx<=n&&1<=ty&&ty<=m)
    			{
    				q.push((node){tx,ty});
    				if(mp[tx][ty]=='o')ny++;
    				else if(mp[tx][ty]=='v')nl++;
    				mp[tx][ty]='#';
    			}
    		}
    	}
    	if(ny>nl)yang+=ny;
    	else lang+=nl;
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    	{ 
    		for(int j=1;j<=m;j++)
    		{
    		 	cin>>mp[i][j];
    		}
    	}	
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			if(mp[i][j]!='#')bfs(i,j);
    //	for(int i=1;i<=n;i++)
    //	{
    //		for(int j=1;j<=m;j++)
    //		{
    //			cout<<mp[i][j];
    //		}
    //		cout<<endl;
    //	}
    			
    	cout<<yang<<" "<<lang<<endl;
    	return 0;
    }
    

    p.s. 惨不忍睹的部分请自行跳过awa

    个人博客地址: www.moyujiang.com 或 moyujiang.top
  • 相关阅读:
    Python的list、tuple、dict常用方法
    Linux和windows下安装python
    Python数据类型一
    pycharm设置
    Python流程控制条件语句和循环语句
    Python类型转换和使用帮助信息
    Feedback Control
    【July】【Machine Leraning】1.微积分和概率论
    Homework
    美海军研究生院(NPS' Advanced Robotic Systems Engineering Laboratory (ARSENL) ) 50 Autonomous UAVs in Flight
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11225621.html
Copyright © 2011-2022 走看看