关键字:搜索、回溯、n层循环的实现
参考《任意N重循环的设计方法与应用_肖建华》
参考http://blog.youkuaiyun.com/whjkm/article/details/38498317
程序 :1 n重循环非递归程序框架
#define N 100
void n_circle(int n, int *LEFT, int *RIGHT, int *STEP )
{
int a[N+1];
int i,k;
for(i=1; i<=n; i++)
a[i]=LEFT[i];
k=n;
while(k>=1)
{
{ }循环体内处理软件
while(a[k]+STEP[K]>RIGHT[k])
{
a[k]=LEFT[k];
k--;
}
if(k==0) continue;//该处也可为break;
a[k]+=STEP[K];
k=n;
}
}
程序 :2 n重循环递归程序框架
#define N 100
int LEFT[N+1],RIGHT[N+1],STEP[N+1];
int a[N+1];
void recursion_circle(int n, int i )
{
int k;
if(i<n)
{
i++;
for(a[i]=LEFT[i]; a[i]<=RIGHT[i]; a[i]+=STEP[i])
recursion_circle(n,i);
}
else
{循环体内语句;
}
}
我的代码:
#include <iostream>
#include<cstdio>
#include<cstring>
const int maxn=10;
int ans[maxn];//最终结果保存在这个数组
int state[maxn];//状态标记 未访问的为0
int n,m;
using namespace std;
void dfs(int pos);
int main()
{
//freopen("D:\\acm.txt","r",stdin);
int N;
scanf("%d",&N);
while(N--)
{
memset(state,0,sizeof(state));
scanf("%d %d",&n,&m);
dfs(1);
}
return 0;
}
void dfs(int pos)//n层循环的递归框架
{
if(pos==m+1)
{
for(int i=1; i<=m; i++)
printf("%d",ans[i]);
printf("\n");
return;
}
for(int i=1; i<=n; i++)
{
if(state[i]==0)
{
ans[pos]=i;
state[i]=1;
dfs(pos+1);
state[i]=0;//回溯(可以注释下看看结果)
}
}
return;
}