相比C语言C++中的vector好像稍显复杂,其实vector是一个非常好用的容器,
比如C语言中对于变长数组是有很大限制的,而使用vector就不用担心这些问题了,
问题:将一个m*n的牌组,初始为向上,依次翻转牌组的牌, 最后牌面向上的有多少张,
代码:
#include<iostream>
#include<vector>
using namespace std;
int rr(int num)
{
return num?0:1;
}
//如果不使用引用,无法改变数组的值
void change(vector <vector <int> > &vec)
{
int i=vec.size();
int j=vec[0].size();
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
vec[a][b]=rr(vec[a][b]);
if(a-1>=0) vec[a-1][b]=rr(vec[a-1][b]);
if((a-1>=0)&&(b-1>=0)) vec[a-1][b-1]=rr(vec[a-1][b-1]);
if((a-1>=0)&&(b+1<j)) vec[a-1][b+1]=rr(vec[a-1][b+1]);
if(b-1>=0) vec[a][b-1]=rr(vec[a][b-1]);
if(b+1<j) vec[a][b+1]=rr(vec[a][b+1]);
if(a+1<i) vec[a+1][b]=rr(vec[a+1][b]);
if((a+1<i)&&(b-1>=0)) vec[a+1][b-1]=rr(vec[a+1][b-1]);
if((a+1<i)&&(b+1<j)) vec[a+1][b+1]=rr(vec[a+1][b+1]);
}
}
}
int sum(vector<vector <int>> &vec)//c++中直接使用引用更加方便
{
int count=0;
int i=vec.size();
int j=vec[0].size();
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
if(!vec[a][b])
count++;
}
}
return count;
}
int main()
{
int m;
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
//一个a行b列的二维数组,可以这样想
//先有一个容器,容器中的元素还是容器,就实现了二维数组
vector<vector<int>> vec(a,vector<int> (b));
//如果开始定义为vector<vector<int>> vec(a);
//那就用resize初始化列,向下面那样
//初始化为0代表牌面向上,1代表向下
for(int i=0;i<a;i++)
{
//vec[i].resize(b);
for(int j=0;j<b;j++)
{
vec[i][j]=0;
}
}
//翻牌函数
change(vec);
//打印一下结果
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
cout<<vec[i][j]<<" ";
}
cout<<endl;
}
//打印最终牌面向上的个数
cout<<sum(vec)<<endl;
}
}
这是使用-std=c++0x标准编译,其余的都在代码中注释了。