⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 life.cpp

📁 是各种常用算法的集合
💻 CPP
字号:
#include "Life.h"
#include <fstream.h>


Life::Life()
{
	ifstream infile;
	infile.open("Life.in",ios::nocreate);
	if(!infile)
	{
		cout<<"Can't open file Life.in for input!\n";
		exit(1);
	}
	int m,n,i,j;
	Arr item;
	char temp;
	infile>>m>>n;
	for(i=0;i<m;i++)
	{
		item.clear();
		for(j=0;j<n;j++)
		{
			infile>>temp;
			if(!infile)
			{
				cout<<"\nInput error!\nToo little data!\nPlease check the input file Life.in!\n";
				exit(1);
			}
			item.push_back(temp=='1');
		}
		m_Map.push_back(item);
	}
	infile>>temp;
	if(infile)
	{
		cout<<"\nInput error!\nToo many data!\nPlease check the input file Life.in\n";
		exit(1);
	}
	Cut();
	m_Gen=1;
}

bool Life::IsColumnEmpty(int i)
{
	if(m_Map.empty()||m_Map[0].empty())return true;
	
	bool result=true;
	
	for(int j=0;j<m_Map.size();j++)
		result=result&&!m_Map[j][i];
	return result;
}

bool Life::IsRowEmpty(int i)
{
	if(m_Map.empty()||m_Map[i].empty())return true;
	
	bool result=true;
	int n=m_Map[i].size();
	
	for(int j=0;j<n;j++)
		result=result&&!m_Map[i][j];
	return result;
}

void Life::Cut()
{
	bool flag=true;
	
	while(!m_Map.empty()&&flag)  //删除首尾空行
	{
		if(IsRowEmpty(0))m_Map.erase(m_Map.begin());
		if(!m_Map.empty()&&IsRowEmpty(m_Map.size()-1))m_Map.pop_back();
		flag=!m_Map.empty()&&(IsRowEmpty(0)||IsRowEmpty(m_Map.size()-1));
	}
	
	flag=true;
	int i;
	while(!m_Map.empty()&&flag)  //删除首尾空列
	{
		flag=IsColumnEmpty(0);
		if(!m_Map.empty()&&!m_Map[0].empty()&&flag)
			for(i=0;i<m_Map.size();i++)
				m_Map[i].erase(m_Map[i].begin());
			
			flag=IsColumnEmpty(m_Map[0].size()-1);
			if(!m_Map.empty()&&!m_Map[0].empty()&&flag)
				for(i=0;i<m_Map.size();i++)m_Map[i].pop_back();
				
				flag=!m_Map.empty()&&(IsColumnEmpty(0)||IsColumnEmpty(m_Map[0].size()-1));
	}
	
	if(m_Map.empty())return;
	for(i=0;i<m_Map.size();i++)	//添加边沿空行空列
	{
		m_Map[i].insert(m_Map[i].begin(),false);
		m_Map[i].push_back(false);
	}
	Arr row;
	for(i=0;i<m_Map[0].size();i++)row.push_back(false);
	m_Map.insert(m_Map.begin(),row);
	m_Map.push_back(row);
	
}


bool Life::Proceed()
{
	if(m_Map.empty())return false;
	std::vector<Arr> old=m_Map;
	int i,j,m,n,row,col,num;
	m=old.size();
	n=old[0].size();
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{
			num=-(int)old[i][j];
			for(row=i-1;row<i+2;row++)
				for(col=j-1;col<j+2;col++)
					if(row>=0&&row<m&&col>=0&&col<n)num+=old[row][col];
					if(old[i][j])
						m_Map[i][j]=(1<num&&num<4);
					else
						m_Map[i][j]=(num==3);
		}
		Cut();
		m_Gen++;
		return true;
}

void Life::Print()
{
	cout<<"\n*************第 "<<m_Gen<<" 代***************\n";
	if(m_Map.empty())
	{
		cout<<"已绝种!\n";
		return;
	}
	int m=m_Map.size();
	int n=m_Map[0].size();
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
			cout<<(m_Map[i][j]?'*':' ');
		cout<<endl;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -