#include题二:“八皇后”问题(假设棋盘上有八个皇后,要求打印所有使八个皇后不会相互攻击的棋子配置)#include #define NUM 5 void repeat(int num); void print(); char s[NUM + 1]; int k = 0; struct list { int token; char load; }; struct list qsort[NUM + 1] = {0}; char copy[NUM + 1]; int main() { scanf("%s", s); int num; num = strlen(s); repeat(num); return 0; } void repeat(int num) { for (int i = num, j = NUM; i > 0; i--) { while((j-1)>=0) while (qsort[--j].token == 0 && j>=0) { qsort[NUM - num].load = s[j]; qsort[j].token = 1; if(num-1>0) repeat(num - 1); } } qsort[NUM].load = ' '; for (int i = NUM ; i >= 0; i--)//如不想留,可根据自身情况进行删除改进 copy[i] = qsort[i].load; for (int i = num, j = NUM - 1; i >= 0; i--, j--) for (int m = NUM - 1; m >= 0; m--) if (s[m] == copy[j]) qsort[m].token = 0; if (num == 1) print(); return; } void print() { static int k=0; printf("%s ", copy); k++; if (k % 10 == 0) printf("n"); }
解释:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
题解:由于八个棋子不同行不同列,所以总会有棋子在第1,2,3,4,5,6,7,8行,可将问题类化为将1 2 3 4 5 6 7 8排序,求有多少中排法?
所以将第一题中的NUM宏定义为8,字符串输入为“12345678”即可求解
#include题三:给定一个数N,要求列出所有不大于N的素数#include #define NUM 8 void repeat(int num); void print(); char s[NUM + 1]; int k = 0; struct list { int token; char load; }; struct list qsort[NUM + 1] = {0}; char copy[NUM + 1]; int main() { scanf("%s", s); int num; num = strlen(s); repeat(num); return 0; } void repeat(int num) { for (int i = num, j = NUM; i > 0; i--) { while((j-1)>=0) while (qsort[--j].token == 0 && j>=0) { qsort[NUM - num].load = s[j]; qsort[j].token = 1; if(num-1>0) repeat(num - 1); } } qsort[NUM].load = ' '; for (int i = NUM ; i >= 0; i--)//如不想留,可根据自身情况进行删除改进 copy[i] = qsort[i].load; for (int i = num, j = NUM - 1; i >= 0; i--, j--) for (int m = NUM - 1; m >= 0; m--) if (s[m] == copy[j]) qsort[m].token = 0; if (num == 1) print(); return; } void print() { static int k=0; printf("%s ", copy); k++; if (k % 10 == 0) printf("n"); }
#include题四:编写一个子程序,进行两个任意大小的矩阵乘法运算int getnum(); void list(int n); void print(int i); int main() { int num; num = getnum(); list(num); return 0; } int getnum() { int num; scanf("%d", &num); return num; } void list(int n) { for (int i = 2; i <= n; i++) { int token = 1; for (int j = 2; j <= i / 2; j++) { if (i == 2) { break; } if (i % j == 0) { token = 0; break; } } if(token ==1) print(i); } } void print(int i) { printf("%d ",i); }
#include标题以上代码均为个人撰写,如有问题,可留评论,共同探讨,共勉#define LINE1 3 #define ROW1 2 #define LINE2 2 #define ROW2 3 void input1(); void input2(); void multiple(); int matrix1[LINE1][ROW1]; int matrix2[LINE2][ROW2]; int main() { input1(); input2(); if (ROW1 == LINE2) multiple(); else printf("第一个矩阵的列数不等于第二个矩阵的行数,矩阵不能进行乘法n"); } void input1() { printf("输入%d行%d列的matrix1矩阵:n", LINE1, ROW1); for (int i = 0; i < LINE1; i++) { for (int j = 0; j < ROW1; j++) { scanf("%d", &matrix1[i][j]); } } } void input2() { printf("输入%d行%d列的matrix2矩阵:n", LINE2, ROW2); for (int i = 0; i < LINE2; i++) { for (int j = 0; j < ROW2; j++) { scanf("%d", &matrix2[i][j]); } } } void multiple() { printf("matrix1矩阵与matrix2矩阵乘积为:n"); for (int i = 0; i < LINE1; i++) {//最终获得行数 for (int j = 0, sum = 0; j < ROW2; j++) {//最终获得列数 for (int k = 0; k < LINE2; k++) sum += matrix1[i][k] * matrix2[k][j]; printf("%3d ", sum); sum = 0; } printf("n"); } }



