- 论坛徽章:
- 0
|
- #include<stdio.h>
- #include<stdlib.h>
- void backtrack(int n);
- int x[8],sum=0;/*sum用于统计共有多少种方案*/
- /*函数功能:回朔求解第n天至第7天的解(即第n~7天分别安排和尚几)*/
- struct st
- {
- int spare[8];
- /*存储和尚的空闲时间,spare=0表示星期i没有空闲,spare=1表示星期i空闲,其中spare[0]不用*/
- int flag;
- /*用于标记和尚周内是否已经工作过,flag=0表示没挑过水,flag=1表示已经挑过水*/
- }monk[8]={
- {0, 1, 0, 1, 0, 0 ,0 },
- {1 ,0 ,0 ,0 ,0 ,1 ,0 },
- {0, 0 ,1 ,0 ,0 ,0 ,1 },
- {0, 0 ,0 ,0 ,1, 0, 0 },
- {1 ,0 ,0, 1 ,0 ,1 ,0 },
- {0 ,1 ,0 ,0 ,1 ,0 ,0 },
- {0 ,0, 1 ,0 ,0 ,1, 1 }
- };
- int main (int argc, char **argv)
- {
- backtrack(0);
- printf("共有%d种方案\n",sum);
- }
- void backtrack(int n)
- {/*函数功能:回朔求解第n天至第7天的解(即第n~7天分别安排和尚几)*/
- int j;
- if(n>6)
- {
- sum++;
- printf("方案%d:\n",sum);
- for(j=0;j<=6;j++)
- {
- printf("星期%d和尚%d挑水\n",j+1,x[j]+1);
- }
- printf("\n");
- }
- else
- {
- for(j=0;j<=6;j++)
- {
- x[n]=j;
- if(monk[j].flag==0&&monk[j].spare[n]==1)
- {//判断和尚j是否已经挑过水及和尚星期n是否有空
- monk[j].flag=1;
- backtrack(n+1);
- monk[j].flag=0;
- }
- }
-
- }
- }
复制代码
和尚这样挑水,这样方便调试。。
[ 本帖最后由 清凉散人 于 2009-10-25 08:34 编辑 ] |
|