天生棋局(堆上申请二维空间的应用)

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 /*
 4     天生棋局
 5 */
 6 #define N 10
 7 //1.传入一个n在堆空间中产生n*n方格的棋盘(生成一个n*n的二维空间)
 8 int **createboard(int n)
 9 {
10     int **p = (int **)malloc(n*sizeof(int*));
11     for(int i = 0;i<n;i++)
12     {
13         p[i] = (int *)malloc(n*sizeof(int));
14     }
15
16     return p;
17 }
18 //2.N颗棋子随机落在棋盘上<需要防止落在同一位置上>
19 void initboard(int **p,int n)
20 {
21     int i,j;
22
23     i = rand()%N;
24     j = rand()%N;
25     p[i][j] = ‘x‘;
26     n -= 1;
27     while(n--)
28     {
29
30         i = rand()%N;
31         j = rand()%N;
32         while(p[i][j] == ‘x‘)
33         {
34             i = rand()%N;
35             j = rand()%N;
36         }
37         p[i][j] = ‘x‘;
38     }
39 }
40 //3.打印棋盘,没旗子的用o表示,有棋子的用X表示
41 void printboard(int **p)
42 {
43     int i,j;
44
45     for(i = 0;i<N;i++)
46     {
47         for(j = 0;j<N;j++)
48         {
49             if(p[i][j] == ‘x‘)
50                 printf("%c\t",p[i][j]);
51             else
52                 printf("%c\t",‘o‘);
53         }
54         putchar(10);
55     }
56 }
57 int main(void)
58 {
59     int ** p = createboard(N);//生成N*N二维空间
60     initboard(p,20);//随机放入20个棋子
61     printboard(p);//打印棋盘
62
63     return 0;
64 }

原文地址:https://www.cnblogs.com/wangchaomahan/p/9982654.html

时间: 2024-11-10 05:05:55

天生棋局(堆上申请二维空间的应用)的相关文章

C++在堆上申请和释放内存 - new &amp; delete

// 动态申请内存, 指向一个未初始化的整型 int *pi = new int; // pi指向一个整型值,初始化为0 int *pi = new int(); // value of i is 1024 int i(1024); // pi指向1024 int *pi = new int(1024); // value of  s is "99999" string s(5, '9'); // *ps is "999999" string *ps = new s

C++中只在栈上或者堆上申请对象

最近阅读Mitsuba的架构,有一个挺有意思的设计,开始没看明白.搜了下资料才搞懂. 有一个基类Object,它的析构函数是protected访问权限的.并且,所有继承Object的类,都需要实现一个自己的protected的析构函数. Mitsuba还特意解释了,这是为了防止在stack上构建Object的对象. 这是怎么回事呢? ”编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查.如果类的析构函数是私有的,则编译器不会在栈

堆上申请数组

方法一:通过数组指针申请连续的空间 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 // 申请a[3][2]三行两列二维数组 6 int (*a)[2] = (int(*)[2])malloc(sizeof(int)*3*2); 7 a[0][0] =1; 8 a[0][1] =2; 9 a[1][0] =3; 10 a[1][1] = 4; 11 a[2][0] =5; 12 a[2][1] = 6; 13

/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题

一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1)         打开项目的Property Pages对话框 2)         点击左侧C/C++节 3)         点击Code Generation节 4)         右侧第六行Runtime Library项目 2.各个设置选项代表的含义 编译选项 包含 静态链接的lib 说明 /MD _MT._DLL MSVCRT.lib 多线程.Release.DLL版本的运行时库 /

C++中栈和堆上建立对象的区别

在C++中类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* p=new A(),A*p=(A*)malloc():静态建立一个类对象,是由编译器为对象在栈空间中分配内存,通过直接移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象.动态建立类对象,是使用new运算符将对象建立在堆空间中,在栈中只保留了指向该对象的指针.栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值,对象的引用地址等.其操作方式类似于数据结构中的栈,通常都是被调用时处于存储

struct对象可能分配在托管堆上吗

struct对象可能被分配在托管堆上吗? --会的. 比如当对struct装箱的时候,就会被分配在托管堆上. 比如,让一个struct实现一个接口. public interface IReport { string Name { get; } } public struct Score : IReport { public string Name { get { return "80分来自struct"; } } } 再来一个类负责打印接口属性值的类和方法. public class

C++ 在堆上开辟与释放二维、三维指针

//C++ 在堆上开辟与释放二维.三维指针 #include<iostream> using namespace std; int main() { //二级指针的开辟与释放 int number = 0; int** p = new int*[4]; for(int i = 0; i < 4; i++) //分级定义数组大小 { p[i] = new int[4]; } for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j

如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)

[本文链接] http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html [题目] 如何限制一个类只在堆上分配和栈上分配? [代码] C++ Code 1234567891011121314   class StackOnly { private:     void *operator new(size_t size) {}; }; class HeapOnly { public:     void destroy(); private

block存储区域——如何验证block在栈上,还是堆上

block存储区域 这就需要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字说的那样,说明了block的三种存储方式:栈.全局.堆. [要点1]定义在函数外面的block是global的:另外如果函数内部的block,但是没有捕获任何自动变量,那么它也是全局的.比如下面这样的代码: typedef int (^blk_t)(int); for(...){ blk_t blk