C的几个小程序和概念(常见操作)(下)

news/2024/7/23 11:40:34 标签: c语言, 排列, 组合, 八皇后问题, new/delete

C的几个小程序和概念(常见操作)(下)

1、排列问题

输出n中取m无重复的元素排列情况。

用递归实现

#include "iostream"

using namespace std;

char f[27];//最多用个字母来表示排列情况

char p[27];//来标识当前字母的获取情况。都从开始,不用。自动初始化为

int m,n;//从n个数中取m个数

FILE *fp=fopen("c:\\pailie.txt","w+");

void pa(int k){

if(k>m) //已取够了m个了,则输出

  {

   for(int i=1;i<=m;i++)

    //putchar(p[i]+'A'-1);

   fprintf(fp,"%c",p[i]+'A'-1);

   //cout<<endl;//输出,换行,返回

   fprintf(fp,"%c",'\n');

   return;

  }//if

//还没有取够m个

for(int i=1;i<=n;i++)

   if(!f[i])

     {

      f[i]=1;//将当前的这个字母作标记

   p[k]=i;//将当前的这个字母取上

   pa(k+1);//继续取下一个字母

   f[i]=0;//将取出的第i个元素重新放入集合S,关键

     }//if

}//pa

int main(){

cout<<"Input n m of P(n,m)=";

cin>>n>>m;

//...进行n,m合乎规定逻辑的判断

if(!fp)  {

 cout<<"error";

     return 1;

         }

pa(1);//先找第一个字符

}

2、组合问题

取n个数字中可重复的m个数的情况

#include "iostream"

using namespace std;

char f[27];//最多用个字母来表示排列情况

char p[27];//来标识当前字母的获取情况。都从开始,不用。自动初始化为

int m,n;//从n个数中取m个数

//FILE *fp=fopen("c:\\pailie.txt","w+");

void pa(int k,int share){

if(k>m) //已取够了m个了,则输出

  {

   for(int i=1;i<=m;i++)

    putchar(p[i]+'A'-1);

   //fprintf(fp,"%c",p[i]+'A'-1);

   cout<<endl;//输出,换行,返回

   //fprintf(fp,"%c",'\n');

   return;

  }//if

//还没有取够m个

for(int i=share+1;i<=n;i++)

   if(!f[i])

     {

      f[i]=1;//将当前的这个字母作标记

   p[k]=i;//将当前的这个字母取上

   pa(k+1,i);//继续取下一个字母

   f[i]=0;//将取出的第i个元素重新放入集合S,关键

     }//if

}//pa

int main(){

cout<<"Input n m of P(n,m)=";

cin>>n>>m;

//...进行n,m合乎规定逻辑的判断

//if(!fp)  {

// cout<<"error";

 //    return 1;

//         }

pa(1,0);//先找第一个字符

}

我们分析问题,可以知道,组合问题是:为了避免重复,取下一个元素时,必须在当前元素的下一位置开始探索。所以再传递一个share变量,以便下一次搜索时从下一个位置开始就好了。

3、八皇后问题

每列必然有一个皇后,每行必然有一个皇后。

放下一列放置皇后时,我们要找的是应当放置在该列的那一行,这样我们与前面的所有列放置的皇后进行操作探索,看是否满足条件。

不满足条件的定义是:(因为是在不同列试探,所以列肯定不同)同处于同一行,或在45角方向上。用(k,j)来描述,k表示列号,j表示行号。

试探过程中,如果第k个皇后无位置可放,则退回上一列,试探第k-1皇后的下一个可放位置,依次类推。这样一直回溯到第一个皇后,如果第一个皇后试完最后一个行号8,则算法停止。

#include "cmath"

#include "iostream"

using namespace std;

int row[8];//由于我们是每一列逐一进行试探,所以只需要保存每一列的行号就可以了。

int count;

void arrange(int k){//试探第k列

int i,j;

if(k>8){//第k列也放置好了,说明存在一个可放置的行系列,输入之

  for(i=1;i<=8;i++)

   cout<<row[i]<<" "; //输出每一列的行号

  cout<<endl;

  count++;

  return;

  }//if

for(j=1;j<=8;j++){//试探当前列的每一行是否满足条件

 for(i=1;i<k;i++)//将当前列的第一行都与前面k-1列放置的皇后位置进行判断,看当前列的试探行是否满足条件

 if(row[i]==j||(k-i)==abs(j-row[i]))//与前面的任何一个皇后同行,或位于角上,则退出此处试探,进行下一轮

  break;

 if(i>=k)//当前第k列的第j行满足条件,记录

 {

 row[k]=j;

 arrange(k+1);//继续放置下一列的皇后

 }//if

  }//for

}//arrange

int main()

{

arrange(1);

cout<<count<<endl;

}

可以得出,是92种。

4、关于new和delete的几个操作

int(*p)[3][4]=new int[2][3][4];//int(*p)[3][4]=(int(*)[3][4])malloc(2*sizeof(int[3][4]));

char **s=new char*[10];//char **s=(char**)malloc(10*sizeof(char*))

int(**p)()=new(int(*)[7]());//int(**p)()=(int(**)())malloc(sizeof(int(*[7])()));

5、字符I/O

输入

int fgetc( FILE *stream );

int getc( FILE *stream );

int getchar( void );//get the char from the stdin

返回int主要是为了允许函数报告文件的末尾EOF

输出

int fputc( int c, FILE *stream );

int putc( int c, FILE *stream );

int putchar( int c );

fgetc,fputc是函数,其它几个都是宏。

撤销字符

int ungetc( int c, FILE *stream );

如果多个字符返回一个流中,则再次读时以反序进行。退回到流和写入到流中不相同。如果用fseek,rewind改变了流的位置,则退回的字符会丢弃。

#include <stdio.h>

#include <ctype.h>

void main( void )

{

   int ch;

   int result = 0;

   printf( "Enter an integer: " );

   /* Read in and convert number: */

   while( ((ch = getchar()) != EOF) && isdigit( ch ) )

      result = result * 10 + ch - '0';    /* Use digit. */

   if( ch != EOF )

      ungetc( ch, stdin );                /* Put nondigit back. */

   printf( "Number = %d\nNextcharacter in stream = %c%c", 

            result, getchar(), getchar());

}


http://www.niftyadmin.cn/n/1098698.html

相关文章

SGA相关的几个动态性能视图

总结一些SGA的相关的动态性能视图&#xff1a; SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi PL/SQL Release 10.2.0.3.0 - Production COR…

SFR算法详解(二)——斜棱法

免责声明&#xff1a;仅供研究讨论&#xff0c;未经确认&#xff0c;相关内容严禁商用&#xff0c;若有错误&#xff0c;欢迎指正。 一、基于初版修正后产生的斜棱法(e-SFR) (1) 选取斜棱所在的ROI区域进行初步分析。 在ISO12233中&#xff0c;这里对选取的ROI提出了几点要求&…

待补题目记录

唉,蒟蒻现在总是想偷懒 在这里把题目链接发来 提醒自己比赛过后一定补补题啊 太懒太笨唉 比赛名字 &#xff1a; &#xff08;以前攒的比赛名字忘了TAT&#xff09; 题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id1016 [图论] 状态&#xff1a;未…

C的几个小程序和概念(常见操作)(中)

C的几个小程序和概念(常见操作)&#xff08;中&#xff09; 1、求和计数 &#xff08;1&#xff09;常见的有三种方法&#xff1a;累乘&#xff0c;累加&#xff0c;递推迭代法。 &#xff08;2&#xff09;求Pi/41-1/31/5-1/7... 正负交叉项数列。用一个符号变量来实现。 …

数据库基础知识(4)

四、超重点 1、SQL语言 &#xff08;1&#xff09;数据定义语言&#xff08;DDL—Data Defintion Language&#xff09; 注释&#xff1a;< 内容 > <>内的内容为必填内容&#xff0c;[内容] []内的内容为可选内容 l 数据库&#xff08;database&#xff09…

模式匹配之Boyer-Moore算法

BM 算法是一个较优的模式匹配算法。一般&#xff0c;如果不考虑模式串的长度&#xff0c;一个具有时间复杂度O(n)的算法应该是最优的了&#xff0c;但是事实不是如此。BM算法可以实现更高效率的模式匹配。分析和实验说明&#xff0c;BM匹配算法对于那些字符集比较大&#xff0c…

解读AWR报告Advisory Statistics

对于Oracle的内存参数的设定存在很多争议&#xff0c;当然具体的设置需要根据系统的情况进行调整&#xff0c;不能一概而论&#xff0c;因此内存参数的设置也就成为了一个难点。但是Oracle 10g、11g的自动内存管理功能还是很强大的&#xff0c;对于负载一般的系统&#xff0c;即…

Oracle 11g 新特性 -- SQL Plan Management 说明

一&#xff0e;概述SQL 语句的SQL 执行计划发生更改时&#xff0c;可能存在性能风险。SQL 计划发生更改的原因有很多&#xff0c;如优化程序版本、优化程序统计信息、优化程序参数、方案定义、系统设计和SQL 概要文件创建等。在以前版本的Oracle DB 中引入了各种计划控制技术&a…