注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mister.Hu(巷里人家)

Go abroad!

 
 
 

日志

 
 
关于我

A campus photograph palyer,an enthusiastic reader,a solitary writer,a future traffic engineer.

网易考拉推荐

C++强化【3】  

2015-07-26 17:44:47|  分类: Senior |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

实例32:推箱子

#include <iostream>

using namespace std;

struct enter

{

       int row;

       int col;

};

//推箱子(数组元素移动)

//已知数组中1-不能通行,0-可以通行,2-箱子所在位置,3-目的地

int main()

{

       int array_032[4][4]={{1,1,0,1},{1,1,2,1},{1,0,0,1},{3,0,1,1}};//数组元素

       enter enter_box;//箱子的位置

       enter_box.row=1;//箱子行

       enter_box.col=2;//箱子列

             

       for(int i=enter_box.row;i<4;i++)//从上到下,从右到左搜索元素为0的位置

       {

              for(int j=enter_box.col;j>=0;j--)

              {

                     if(array_032[i][j]==0)//继续搜索

                     {

                            enter_box.row=i;

                            enter_box.col=j;

                            cout<<"("<<enter_box.row<<","<<enter_box.col<<")->";

                     }

                     else if(array_032[i][j]==1)//不能移动

                     {}

                     else if(array_032[i][j]==3)

                     {cout<<"到达目的地"<<endl;}

                     else

                     {}

              }

       }

       return 0;

}

注:实际上此例是有问题的,它从箱子的起点开始,以其为矩阵的右上角进行搜索,找到0则视为可行。它忽视了终点的位置,且默认路径只有一条,且没有断头路。

 

实例36:整数从大到小排序

#include <iostream>

using namespace std;

int main()

{

       int src[10] = {11,12,47,24,49,69,90,89,18,39};//一维数组中包含10个整数

       //从大到小排序

       for(int i = 0; i < 10; i++)

       {

              for(int j = i+1; j < 10; j++)

              {

                     if(src[i]<src[j])//如果前一个元素小于后一个元素

                     {

                            int temp;//临时变量

                            temp = src[i];

                            src[i] = src[j];//大的元素到前一个位置

                            src[j] = temp;//小的元素到后一个位置

                     }

              }

       for(int k = 0; k < 10; k++)

       {

              cout<<src[k]<<"-";

       }

       cout<<endl;

       }

       return 0;

}

注:非常经典的排序代码,斜体为自己加上去的,为了更直观地观察该排序代码的运行功能,输出如下:

可见,每一次的i都是把src[i]对应的位置中的最大值摘取出来,因为代码群

for(int j = i+1; j < 10; j++)

              {

                     if(src[i]<src[j])//如果前一个元素小于后一个元素

                     {

                            int temp;//临时变量

                            temp = src[i];

                            src[i] = src[j];//大的元素到前一个位置

                            src[j] = temp;//小的元素到后一个位置

                     }

              }

即是把整个数组中的在src[i]之后的数分别与src[i]对比,并不断替换大值,故最终得到的src[i]是其之后的数中最大的。

另外需要注意,src[0]代表的是第一个值,即数组src[10]代表src[0]- src[9],所以判断时皆取<10

 

实例38:查找矩阵最大元素

#include <iostream>

using namespace std;

#define M 5

#define N 5

int main()

{

       int juzhen[M][N];

       int max;

       int row,column;

       cout<<"please input the number in order"<<endl;

       for(int i=0;i<M;i++)

       {

              for(int j=0;j<N;j++)

              {

                     cin>>juzhen[i][j];

              }

       }

       max=juzhen[0][0];

       for(int r=0;r<M;r++)

       {

              for(int k=0;k<N;k++)

              {

                     if(max<juzhen[r][k])

                     {

                            max=juzhen[r][k];

                            row=r+1;

                            column=k+1;

                     }

              }

       }

       cout<<"the max number is"<<max<<"="<<"juzhen["<<row<<"]["<<column<<"]"<<endl;

       return 0;

}

注:需要注意两点,第一是主体函数内用了两次双for循环,参数i j不能重复,否则会出现redifination error。第二是最大值的判断,注意与一维矩阵进行对比。

 

实例39:二分法查找目标

#include <iostream>

using namespace std;

int array_039[10]={0,1,2,3,4,5,6,7,8,9};

void binary_search(int left,int right,int value)

{

       int search_index;

       search_index=(left+right)/2;//二分

       if(array_039[search_index]==value)//如果等于二分点值

              cout<<"元素"<<value<<"位于第"<<search_index<<""<<endl;

       else if(value>array_039[search_index])//大于,往右边移

              binary_search(search_index+1,right,value);

       else if(value<array_039[search_index])//小于,往左边移

              binary_search(left,search_index-1,value);

       else

              return;

}

int main()

{

       int temp;

       cout<<"输入你想要找的元素值:";

       cin>>temp;

       binary_search(0,9,temp);

       return 0;

}

注:二分法的思想非常简单,在此不做介绍,此例的精华在void binary_search(int left,int right,int value)函数,注意,函数括号内的变量并不是函数内所有的变量,而是指外部变量。

此函数的外部变量有数组的边界值(不是指边界对应的数组值而是指数组中数的个数)以及需要找的值,也就是说,只要知道这三个值这个函数就可以得出得数了。

在函数内部,又重新调用了函数本身,这样可以一直迭代直到找到该值。

还需要注意if(array_039[search_index]==value)中不要写成一个等于号!

 

实例41:获得数组大小(sizeof

#include <iostream>

using namespace std;

 

//    获取数组大小(sizeof

int main()

{

       int array_041[4]={1,1,2,4};

       cout<<"整型数组array_041的大小:"<<sizeof(array_041)/sizeof(int)<<endl;

       return 0;

}

注:关键在于sizeof(array_041)/sizeof(int),因为数组中的数都是int型的,而sizeof是得出占用字节数,故需要除以sizeof(int)

 

实例042:按位数排列(一个数位数越多越往后排)

#include <iostream>

using namespace std;

int weishu(int chushu, int shu)

{

       double result;

       result=double(shu/chushu);

       int new_chushu=chushu;

       if((result>=0)&&(result<=9))

              return new_chushu;

       else

       {

              new_chushu=chushu*10;

              weishu(new_chushu,shu);

       }

}

int main()

{

       int array_042[10]={1,21,3231,423,1,11,14334,15466};

       int beishu[10]={1};

       for(int k=0;k<10;k++)

              beishu[k]=weishu(1,array_042[k]);

       for(int i=0;i<10;i++)

       {

              for(int j=i+1;j<10;j++)

              {

                    

                     if(beishu[i]<=beishu[j])//不改变位置

                     {}

                     else

                     {

                            int temp;

                            temp=array_042[i];

                            array_042[i]=array_042[j];

                            array_042[j]=temp;

                            temp=beishu[i];

                            beishu[i]=beishu[j];

                            beishu[j]=temp;

                     }

              }

       }

       cout<<"按位数排列后的array_042为:"<<endl;

       for(int r=0;r<10;r++)

       {

              cout<<array_042[r]<<endl;

       }

       return 0;

}

注:前面的weishu函数用于对一个数字的位数的判断,但其输出的不是绝对的位数,而是相对的,比如对于2位数,其输出的是10,对于3位数,其输出的100.若改成下面的样子,则可以输出具体的位数:

#include <iostream>

using namespace std;

int weishu(int shu)

{

       int i=0;

       int j=1;

       while(1)

       {     

              double result=double(shu/j);

              if((result>=0)&&(result<=9))

              {

                     i=i+1;

                     return i;

                     break;

              }

              else

              {

                     i++;

                     j*=10;

              }

       }

}

int main()

{

       int array_042[10]={1,21,3231,423,1,11,14334,15466};

       int beishu[10]={1};

       for(int k=0;k<10;k++)

              beishu[k]=weishu(array_042[k]);

       for(int i=0;i<10;i++)

       {

              for(int j=i+1;j<10;j++)

              {

                    

                     if(beishu[i]>beishu[j])//不改变位置

                    

                     {

                            int temp;

                            temp=array_042[i];

                            array_042[i]=array_042[j];

                            array_042[j]=temp;

                            temp=beishu[i];

                            beishu[i]=beishu[j];

                            beishu[j]=temp;

                     }

              }

       }

       cout<<"按位数排列后的array_042为:"<<endl;

       for(int r=0;r<10;r++)

              cout<<array_042[r]<<endl;

              for(int s=0;s<10;s++)

              cout<<beishu[s]<<endl;

 

       return 0;

}

对于main函数,先把数组中每个数的位数导入到新的数组中,此时有两个相互对应的数组,array_042[i]beishu[i],因此在之后的排序中,每一次比较后,需要更换两个数组的数字的位置。具体可参考实例36 整数从大到小排序。

  评论这张
 
阅读(109)| 评论(19)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016