@yudesong
2017-06-24T16:18:56.000000Z
字数 4547
阅读 616
经典算法题
给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可以用1将迷宫围起来避免边界问题。
参考代码:
#include <stdio.h>int visit(int i , int j);int maze[7][7] = {{2,2,2,2,2,2,2},{2,0,0,0,0,0,2},{2,0,2,0,2,0,2},{2,0,0,2,0,2,2},{2,2,0,2,0,2,2},{2,0,0,0,0,0,2},{2,2,2,2,2,2,2},};int si = 1 , sj = 1 ;int ei = 5 , ej = 5 ;int success = 0 ;int main(){int i , j ;printf("Display the maze :\n");for(i = 0 ; i < 7 ; i++){for(j = 0 ; j < 7 ; j++){if(maze[i][j] == 2){printf("■");}else{printf(" ");}}printf("\n");}if(visit(si , sj) == 0){printf("\nNot found exit !");}else{printf("Display the maze :\n");for(i = 0 ; i < 7 ; i++){for(j = 0 ; j < 7 ; j++){if(maze[i][j] == 2){printf("■");}else if(maze[i][j] == 1){printf("◇");}else{printf(" ");}}printf("\n");}}return 0 ;}int visit(int i , int j){maze[i][j] = 1 ;if(i == ei && j == ej)success = 1 ;if(success != 1 && maze[i][j + 1] == 0)visit(i , j + 1);if(success != 1 && maze[i + 1][j] == 0)visit(i + 1 , j);if(success != 1 && maze[i - 1][j] == 0)visit(i - 1 , j);if(success != 1 && maze[i][j - 1] == 0)visit(i , j - 1);if(success != 1)maze[i][j] == 0 ;return success ;}
void reverseOrder(char* str, int p, int q){char temp;while(p < q){temp = str[p];str[p] = str[q];str[q] = temp;p ++;q --;}}char* multiLargeNum(char* A, char* B){int m = strlen(A);int n = strlen(B);char* result = new char[m+n+1];memset(result, '0', m+n);result[m+n] = '\0';reverseOrder(A, 0, m-1);reverseOrder(B, 0, n-1);int multiFlag; // 乘积进位int addFlag; // 加法进位for(int i=0; i <= n-1; i++) // B的每一位{multiFlag = 0;addFlag = 0;for(int j=0; j <= m-1; j++) // A的每一位{// '0' - 48 = 0int temp1 = (A[j] - 48) * (B[i] - 48) + multiFlag;multiFlag = temp1 / 10;temp1 = temp1 % 10;int temp2 = (result[i+j] - 48) + temp1 + addFlag;addFlag = temp2 / 10;result[i+j] = temp2 % 10 + 48;}result[i + m] += multiFlag + addFlag;}reverseOrder(result, 0, m+n-1); // 逆序回来return result;}int main(){char A[] = "962346239843253528686293234124";char B[] = "93459382645998213649236498";char *res = multiLargeNum(A, B);if(res[0] != 48)printf("%c", res[0]);printf("%s", res+1);delete [] res;return 0;}
#include<stdio.h>#include<string.h>#define Max 101void print(char sum[]);void bigNumAdd(char a[],char b[],char sum[]);int main(){char a[Max];char b[Max];char sum[Max];gets(a);gets(b);bigNumAdd(a,b,sum);print(sum);return 0;}void bigNumAdd(char a[],char b[],char sum[]){int i=0;int c=0;//表示进位//初始化,对以后位运算有很大帮助!char m[Max]={0};char n[Max]={0};memset(sum,0,Max*sizeof(char)); //这里不能写成memset(sum,0,sizeof(sum));原因见注意事项1//字符串反转且字符串变数字int lenA=strlen(a);int lenB=strlen(b);for (i=0;i<lenA;i++){m[i]=a[lenA-i-1]-'0';}for (i=0;i<lenB;i++){n[i]=b[lenB-i-1]-'0';}//位运算for (i=0;i<lenA||i<lenB;i++){sum[i]=(m[i]+n[i]+c)%10+'0';//得到末位c=(m[i]+n[i]+c)/10;//得到进位}}void print(char sum[]){int i=0;int j=0;int len = strlen(sum);for (i=len-1;sum[i]==0;i--); //找到第一个不为零的位置,方便输出for (j=i;j>=0;j--){printf("%c",sum[j]);}}
#include <iostream>#include <math.h>using namespace std;const int N=20;int q[N];int count=0;void display(){count++;int i;for(i=1;i<=6;i++)cout<<q[i]<<" ";cout<<endl;}bool find(int i,int j){int m=1;while(m<j){if((q[m]==i) || abs(q[m]-i)==abs(m-j))return false;m++;}return true;}void place(int i,int n){if(i>n) display();else{int j;for(j=1;j<=n;j++){if(find(j,i)){q[i]=j;place(i+1,n);}}}}int main(){place(1,6);return 0;}
#include<iostream>#include<iomanip>using namespace std;int n;int cost[20][20]={};bool done[20]={1};int start = 0; //从城市0开始int imin(int num, int cur){if(num==1) //递归调用的出口return cost[cur][start];//所有节点的最后一个节点,最后返回 最后一个节点到起点的路径int mincost = 10000;for(int i=0; i<n; i++){cout<<i<<" i:"<<done[i]<<endl;if(!done[i] && i!=start) //该结点没加入 且 非起始点{if(mincost <= cost[cur][i]+cost[i][start]){continue;//其作用为结束本次循环。即跳出循环体中下面尚未执行的语句。区别于break}done[i] = 1; //递归调用时,防止重复调用int value = cost[cur][i] + imin(num-1, i);if(mincost > value){mincost = value;}done[i] = 0;//本次递归调用完毕,让下次递归调用}}return mincost;}int main(){// cin >> n;n=4;int cc[4][4]={{0 ,4, 1, 3},{4 ,0 ,2, 1},{1 ,2 ,0, 5},{3 ,1, 5, 0}};for(int i=0; i<n; i++){for(int j=0; j<n; j++){//cin >> cost[i][j];cost[i][j]=cc[i][j];}}cout << imin(n, start) << endl;return 0;}
int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值int max(int a,int b){if(a>=b)return a;else return b;}int KnapSack(int n,int w[],int v[],int x[],int C){int i,j;for(i=0;i<=n;i++)V[i][0]=0;for(j=0;j<=C;j++)V[0][j]=0;for(i=0;i<=n-1;i++)for(j=0;j<=C;j++)if(j<w[i])V[i][j]=V[i-1][j];elseV[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);j=C;for(i=n-1;i>=0;i--){if(V[i][j]>V[i-1][j]){x[i]=1;j=j-w[i];}elsex[i]=0;}printf("选中的物品是:\n");for(i=0;i<n;i++)printf("%d ",x[i]);printf("\n");return V[n-1][C];}void main(){int s;//获得的最大价值int w[15];//物品的重量int v[15];//物品的价值int x[15];//物品的选取状态int n,i;int C;//背包最大容量n=5;printf("请输入背包的最大容量:\n");scanf("%d",&C);printf("输入物品数:\n");scanf("%d",&n);printf("请分别输入物品的重量:\n");for(i=0;i<n;i++)scanf("%d",&w[i]);printf("请分别输入物品的价值:\n");for(i=0;i<n;i++)scanf("%d",&v[i]);s=KnapSack(n,w,v,x,C);printf("最大物品价值为:\n");printf("%d\n",s);}