コード例 #1
0
int main (void)
{
  int i;
  int min;
  int size;
  int grid[MAX_GRID * MAX_GRID];
  int nLogs;

  /* Read grid size and number of logs. */
  scanf ("%d %d", &size, &nLogs);

  /* Read log pile locations. */
  for (i = 0; i < size * size; i++) {
    scanf ("%d", &grid[i]);
  }

  /* Place logs. */
  while (nLogs > 0) {
    grid[findMinIndex (grid, size)]++;
    nLogs--;
  }

  /* Print grid. */
  for (i = 0; i < size * size; i++) {
    printf ("%d ", grid[i]);
    if ((i+1) % size == 0) {
      printf ("\n");
    }
  }

  return 0;
}
コード例 #2
0
Index bTree::findMinIndex(bTreeNode& node){
    Index res;
    if(node.type==LEAF)
        res=node.indexList.front();
    else
    {
        bTreeNode temp = assignNode(node.ptrList.front());
        res = findMinIndex(temp);
        freeNode(temp);
    }
    return res;
}
コード例 #3
0
 int main (void)
 {
   int i;
   int index;
   int diff;
   int len;   /* length of grid */
   int size;  /* size of grid = length * length */
   int nLogs; /* number of logs */
   int *grid; /* pile locations array */
   
   /* Read grid size and number of logs. */
   scanf ("%d %d", &len, &nLogs);
   size = len * len;
   
   /* Allocate grid array. */
   grid = (int *) malloc (sizeof (int) * size);
   
   /* Read log pile locations. */
   for (i = 0; i < size; i++) {
     scanf ("%d", &grid[i]);
   }
   
   /* Place logs. */
   while (nLogs > 0) {
     index = findMinIndex (grid, size, &diff);
     /* If the minimum difference is zero, add 1 rod, not 0. */
     if (diff == 0) {
       diff = 1; 
     }
     grid[index] += diff;
     nLogs -= diff;
   }
   
   /* Print grid. */
   for (i = 0; i < size; i++) {
     printf ("%d ", grid[i]);
     if ((i+1) % len == 0) {
       printf ("\n");
     }
   }
   
   /* Clean up. */
   free (grid);
   
   return 0;
 }
//排序函数
void sort(int p[],const int len)
{
	int i;
	int temp;
	int min;

	//接收用户输入
	for( i = 0; i < len; i++)
	{
		printf("请输入第%d个元素:",i+1);
		scanf("%d",&p[i]);
	}
	
	//输出原始状态的数组
	printf("数组的初始状态是:");
	for(i = 0; i < len; i++)
		printf("%d ",p[i]);
	printf("\n");

	//按要求排序
	for(i = len; i >= 2; i--)
	{	
		min = findMinIndex(p,i);   //调用找最小值下标的函数
		temp = p[i-1];
		p[i-1] = p[min];
		p[min] = temp;
	}

	//输出排序后的结果
	printf("排序后数组的状态是:");
	for(i = 0; i < len; i++)
		printf("%d ",p[i]);
	printf("\n");

	system("pause");
	exit(0);
}
コード例 #5
0
void bTree::deleteNode(unsigned int parent, unsigned int path){
    findPath.pop_back();

    unsigned int i;
    bTreeNode cur = assignNode(parent);

    cur.dirty = true;
    Index backupInd;
    backupInd = cur.indexList.front();
    if (path > 0)
        cur.indexList.erase(cur.indexList.begin()+path-1);
    else
        cur.indexList.erase(cur.indexList.begin()+path);
    cur.ptrList.erase(cur.ptrList.begin()+path);
    cur.valNum--;

    if(cur.type != ROOT && cur.valNum+1<(cur.maxNum+2)/2)
    {
        bTreeNode left,right;
        unsigned int path = findPath.back();
        bTreeNode temp = findBro(cur);
        if(temp.type == INIT)
        {
            freeNode(cur);
            return;
        }
        if(temp.indexList.front()<backupInd)
        {
            left = temp;
            right = cur;
        }
        else
        {
            left = cur;
            right = temp;
            path++;
        }
        left.dirty = true;
        right.dirty = true;
        if(left.valNum + right.valNum + 2 <= left.maxNum + 1)
        {
            left.indexList.push_back(findMinIndex(right));
            unsigned int i;
            for (i = 0; i < right.valNum; ++i)
            {
                left.indexList.push_back(right.indexList[i]);
                left.ptrList.push_back(right.ptrList[i]);
                bTreeNode temp = assignNode(right.ptrList[i]);
                temp.dirty = true;
                temp.parentPtr = left.blockNo;
                freeNode(temp);
            }
            left.ptrList.push_back(right.ptrList.back());
            bTreeNode temp = assignNode(right.ptrList.back());
            temp.dirty = true;
            temp.parentPtr = left.blockNo;
            freeNode(temp);
            left.valNum+=right.valNum+1;
            freeNode(left);
            cleanNode(right);
            deleteNode(right.parentPtr,path);
        }
        else
        {
            unsigned int half = (left.valNum + right.valNum + 2) / 2;
            unsigned int i;
            right.indexList.insert(right.indexList.begin(),findMinIndex(right));
            for (i = left.valNum+1; i < half; ++i)
            {
                left.indexList.push_back(right.indexList.front());
                left.ptrList.push_back(right.ptrList.front());
                left.valNum++;
                right.ptrList.erase(right.ptrList.begin());
                right.indexList.erase(right.indexList.begin());
                right.valNum--;
                bTreeNode temp = assignNode(left.ptrList.back());
                temp.dirty = true;
                temp.parentPtr = left.blockNo;
                freeNode(temp);
            }
            for (i = left.valNum; i >= half; --i)
            {
                right.indexList.insert(right.indexList.begin(),left.indexList.back());
                right.ptrList.insert(right.ptrList.begin(),left.ptrList.back());
                right.valNum++;
                left.ptrList.erase(left.ptrList.end());
                left.indexList.erase(left.indexList.end());
                left.valNum--;
                bTreeNode temp = assignNode(right.ptrList.front());
                temp.dirty = true;
                temp.parentPtr = right.blockNo;
                freeNode(temp);
            }
            right.indexList.erase(right.indexList.begin());
            bTreeNode temp = assignNode(right.parentPtr);
            temp.dirty = true;
            temp.indexList[path-1] = findMinIndex(right);
            freeNode(temp);
            freeNode(left);
            freeNode(right);
        }
    }
    else if(cur.type==ROOT&&cur.valNum==0)
    {
        bTreeNode temp = assignNode(cur.ptrList.front());
        if(temp.type == LEAF)
        {
            freeNode(temp);
            freeNode(cur);
            return;
        }
        temp.dirty = true;
        temp.type = ROOT;
        temp.parentPtr = 0;
        cleanNode(cur);
        freeNode(temp);
        root = temp.blockNo;
    }
    else
        freeNode(cur);
    return;
}