算法-只用O(1)个循环语句实现N重循环

发布于 2016-12-15 00:03:05 字数 504 浏览 1451 评论 8

只是用O(1)个循环语句实现N重循环。给出一个Loop[N],Loop[i]表示第i层循环的次数。
要求:
- 只能使用O(1)次循环语句,
- 能够完成Loop[N]所描述的N重循环
- 能够给出一个index[N]表示当前各层循环的index
- 给出代码(语言限定为C/C++/Java)实现

示例
给出 Loop[]={2,5,6}
能够实现下面代码能做的事情

for(int i=0;i<2;++i)
for(int j=0;j<5;++j)
for(int k=0;k<6;++k){
/* 这里index[0]=i,index[1]=j,index[2]=k .... */
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

清晨说ぺ晚安 2017-08-14 03:51:32

static void Main(string[] args)
{
int i=0,j=0,k=0;
for (int x = 0; x < (2 * 5 * 6 - 1); x++)
{

++k;
if (k == 6)
{
j++;
k = 0;
}
if (j == 5)
{
i++;
j = 0;
k = 0;
}
Console.WriteLine("i:"+i+",j:"+j+",k:"+k);
}
Console.Read();
}

这也行吧。

夜无邪 2017-07-24 04:15:00

int n = 0;
for(int i = 0; i < loop[n]; i++)
{
// do sth...

if(n != maxloop - 1 && i == loop[n] - 1) n++, i = 0;
}

算是最短最好理解了的吧?

归属感 2017-05-20 16:32:43

  #include<iostream>
using namespace std;

int main()
{
int loop[6]={2,3,4,5,6,7};
int n=2*3*4*5*6*7;
int i=0;
for(i=0;i<n;i++)
{
int k=i;
for(int j=0;j<6;j++)
{
cout<<k%loop[j]<<" ";
k/=loop[j];
}
cout<<endl;
}
return 0;
}

浮生未歇 2017-04-20 05:37:30

 #include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
int n=3;
int Loop[3]={2,3,4};
int index[3]={0,0,0};
int p=n-1;
while(1){
if(index[p]==Loop[p]){
index[p]=0;
p--;
if(p==-1) break;//溢出时终止
index[p]++;
}
else {
p=n-1;//继续从最低位加

//代码区
for(int i=0;i<3;i++)
printf("%d ",index[i]);
printf("n");
//
index[p]++;
}
}
system("pause");
return 0;
}

浮生未歇 2017-04-10 10:34:44

不能理解这问题精妙在何处.对于cpu而已,干的事情丝毫没有减少,都是遍历全部.只是程序员的文字游戏而已.并且这种文字游戏加入了大量的判断支路,进一步降低了运行效率.这种问题还是少出现的好.好的算法应该是使事情简单,就算不简单,也最起码让代码变得整洁简单..这个算什么?

虐人心 2017-03-14 04:24:05

现在没有c的环境,先写一个php版本

<?php
$loop = array(2, 5, 6);
$index = array(0, 0, 0);
$point = count($loop) - 1;

while(true) {
if($index[$point] == $loop[$point]) {
if($point == 0) {
break;
}

$index[$point] = 0;
$index[--$point]++;
continue;
}

if($point < count($loop) - 1) {
$point++;
} else {
printf("i=%d, j=%d, k=%dn", $index[0], $index[1], $index[2]);
$index[$point]++;
}
}

输出

 D:AppServphp5php.exe -c D:AppServphp5php.ini -e -f "C:Documents and SettingsAdministrator桌面test2.php"
i=0, j=0, k=0
i=0, j=0, k=1
i=0, j=0, k=2
i=0, j=0, k=3
i=0, j=0, k=4
i=0, j=0, k=5
i=0, j=1, k=0
i=0, j=1, k=1
i=0, j=1, k=2
i=0, j=1, k=3
i=0, j=1, k=4
i=0, j=1, k=5
i=0, j=2, k=0
i=0, j=2, k=1
i=0, j=2, k=2
i=0, j=2, k=3
i=0, j=2, k=4
i=0, j=2, k=5
i=0, j=3, k=0
i=0, j=3, k=1
i=0, j=3, k=2
i=0, j=3, k=3
i=0, j=3, k=4
i=0, j=3, k=5
i=0, j=4, k=0
i=0, j=4, k=1
i=0, j=4, k=2
i=0, j=4, k=3
i=0, j=4, k=4
i=0, j=4, k=5
i=1, j=0, k=0
i=1, j=0, k=1
i=1, j=0, k=2
i=1, j=0, k=3
i=1, j=0, k=4
i=1, j=0, k=5
i=1, j=1, k=0
i=1, j=1, k=1
i=1, j=1, k=2
i=1, j=1, k=3
i=1, j=1, k=4
i=1, j=1, k=5
i=1, j=2, k=0
i=1, j=2, k=1
i=1, j=2, k=2
i=1, j=2, k=3
i=1, j=2, k=4
i=1, j=2, k=5
i=1, j=3, k=0
i=1, j=3, k=1
i=1, j=3, k=2
i=1, j=3, k=3
i=1, j=3, k=4
i=1, j=3, k=5
i=1, j=4, k=0
i=1, j=4, k=1
i=1, j=4, k=2
i=1, j=4, k=3
i=1, j=4, k=4
i=1, j=4, k=5

甜柠檬 2017-02-19 09:29:01

//以空间换时间
void test(int i , int j , int k ){
if(i<TEMP1){
if(j < TEMP2){
if(k<TEMP3){
test(i , j , k+1);
cout << i << j << k << endl ;

}else{
j+=1 ;
k =0 ;
test(i , j , k) ;
}
}else{
i+=1 ;
j =0 ;
test(i , j , k ) ;
}
}
}

偏爱自由 2016-12-27 20:17:58

 for(int i=0;i<N;i++)index[i]=0;
for(;index[0]<Loop[0];index[N-1]++)
for(i=N-1;i>0;i--)
if(index[i]==Loop[i]){
index[i]=0;
index[i-1]++;
}

两个循环,应该够了吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文