标签:style blog io ar color sp for div 问题
1.汉诺塔问题
#include<stdio.h> void han(int,char,char,char ); int main() { int n; char a=‘A‘,b=‘B‘,c=‘C‘; scanf("%d",&n); han(n,a,b,c); } void mov(char a,char b) { printf("%c=>%c\n",a,b); } void han(int n,char a,char b,char c) { if(n==1) mov(a,c); else { han(n-1,a,c,b); mov(a,c); han(n-1,b,a,c); } }
2.进制转换问题
输入两个数,一个表示现有的数eg,另一个表示要转换的几进制数ch。用eg模ch,并用一个数组来存即可。
#include<stdio.h> int main() { int a[10000]; int eg,ch; int i,j; scanf("%d%d",&eg,&ch); for(i=0; i<10000; i++) a[i]=0; for(i=0; i<10000; i++) { a[i]=eg%ch; eg=eg/ch; } for(i=9999; i>-1; i--) if(a[i]!=0) break; for(j=i; j>-1; j--) printf("%d",a[j]); }
3.八皇后问题
定义一个a[8]数组来存,判断是否满足条件,可用a[j]==i||i-t==a[j]-j||t+i==a[j]+j
示意如下
0 -1 -2 -3 -4 -5 -6 -7
1 0 -1 -2 -3 -4 -5 -6
2 1 0 -1 -2 -3 -4 -5
3 2 1 0 -1 -2 -3 -4
4 3 2 1 0 -1 -2 -3
5 4 3 2 1 0 -1 -2
6 5 4 3 2 1 0 -1
7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
4 5 6 7 8 9 10 11
5 6 7 8 9 10 11 12
6 7 8 9 10 11 12 13
7 8 9 10 11 12 13 14
只要判断i-t==a[j]-j和t+i==a[j]+j就可,之后再进行下一列
#include<stdio.h> int a[8]; int cnt=0; void et(int a[8],int t) { int i,j; if(t==8) cnt++; else { for(i=0; i<8; i++) { int ok=1; a[t]=i; for(j=0; j<t; j++) { if(a[j]==i||i-t==a[j]-j||t+i==a[j]+j) { ok=0; break; } } if(ok) et(a,t+1); } } } int main() { et(a,0); printf("%d",cnt); }
4.二分查找
按半查找即可
#include<stdio.h> a[10]={6,8,14,25,36,45,75,85,99,102}; int main() { int er(int t,int up,int down); int t,ant; scanf("%d",&t); ant=er(t,9,0); printf("%d",ant); } int er(int t,int up,int down) { int m; while(up!=down) { m=down+(up-down)/2; if(a[m]==t) return m+1; if(a[m]<t) down=m+1; else up=m; } return -1; }
5 .枚举排列
按照八皇后的方法来做,如下
a[1000]用来存结果,pl函数内if语句判断是否到边际,else 用来循环1到n并进行回溯。
#include<stdio.h> int a[1000]; int n; int main() { void pl(int t,int a[1000]); scanf("%d",&n); pl(0,a); } void pl(int t,int a[1000]) { int i,j; if(t==n) { for(i=0;i<n;i++) printf("%d",a[i]); printf("\n"); } else{ for(j=1;j<=n;j++) { int k; int ok=1; for(k=0;k<t;k++) { if(a[k]==j) {ok=0;break;} } if(ok) {a[t]=j;pl(t+1,a);} } } }
6,火柴棍问题
直接枚举,先枚举前两个,计算第三个,判断这三个所需的火柴棍数之和加4是否等于n,即可。
#include<stdio.h> int num[]={6,2,5,5,4,5,6,3,7,6}; int cnt=0; int de(int d) { int sum=0; if(d==0) return 6; while(d) { sum+=num[d%10]; d=d/10; } return sum; } int main() { int n; int i,j; scanf("%d",&n); for(i=0;i<1000;i++) { for(j=0;j<1000;j++) { if(de(i)+de(j)+de(i+j)+4==n) cnt++; } } printf("%d",cnt); }
7
标签:style blog io ar color sp for div 问题
原文地址:http://www.cnblogs.com/mrlei/p/4148485.html