算法-只用O(1)个循环语句实现N重循环
只是用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
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();
}
这也行吧。
int n = 0;
for(int i = 0; i < loop[n]; i++)
{
// do sth...
if(n != maxloop - 1 && i == loop[n] - 1) n++, i = 0;
}
算是最短最好理解了的吧?
#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;
}
#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;
}
不能理解这问题精妙在何处.对于cpu而已,干的事情丝毫没有减少,都是遍历全部.只是程序员的文字游戏而已.并且这种文字游戏加入了大量的判断支路,进一步降低了运行效率.这种问题还是少出现的好.好的算法应该是使事情简单,就算不简单,也最起码让代码变得整洁简单..这个算什么?
现在没有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
//以空间换时间
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 ) ;
}
}
}
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]++;
}
两个循环,应该够了吧