#include <stdio.h> #include <stdbool.h> #include <string.h> const int N = 9; int q[9]; bool C[9];//第j列的安全性 bool L[17]; bool R[17]; int a[9][9]; void try(int row) { for(int col = 1;col <= 8;col++) { if(C[col]&&R[row + col] && L[row-col+N] && a[col][row] == 1) { q[row] = col; C[col] = false; L[row - col + N] = false; R[row + col] = false; if(row < 8) { try(row+1); } else { for(int i = 1;i <= 8;i++) { printf("%d",q[i]); } printf("\n"); break; } //回溯:恢复三个方向的安全标记 C[col] = true; L[row - col + N] = true; R[row + col] = true; } } } int main() { for(int i = 0;i < 9;i++) { C[i] = true; } for(int j = 0;j < 17;j++) { L[j] = true; R[j] = true; } for(int i = 0;i < 9;i++) { for(int j = 0;j < 9;j++) { a[i][j] = 0; } } for(int i = 1;i <= 9;i++) { for(int j = 1;j <= 9;j++) { char h; scanf("%c",&h); if(h == '.') { a[i][j] = 1; } } } try(1); return 0; }如何解决输出前需要多次输入会车
时间: 2023-07-15 12:15:41 浏览: 206
这个问题可以通过清空输入缓冲区来解决。在每次输入字符后,使用一个空循环来读取输入缓冲区中的多余字符,直到读取到换行符为止。具体实现如下:
```
for(int i = 1;i <= 9;i++) {
for(int j = 1;j <= 9;j++) {
char h;
scanf("%c",&h);
if(h == '.') {
a[i][j] = 1;
}
while(getchar() != '\n'); // 清空输入缓冲区
}
}
```
这样就可以保证每次输入字符时,输入缓冲区中没有多余的字符,从而避免了输出前需要多次输入的问题。
相关问题
优化这段代码#include<stdio.h> #include <string.h> #include <stdbool.h> #pragma warning(disable:4996) int main() { int N, sum = 1, t = 1, temP = 0; scanf("%d", &N); while (temP + sum < N) { sum += temP; temP = sum; sum = 2 * temP + 1; t++; } if (N == 1) printf("1"); else printf("%d", t); return 0; }
这段代码的问题不太明显,但是有几个可以进行优化的地方:
1. 对变量进行命名:代码中的变量名有些不太明确,可以对它们进行更加明确的命名,以提高代码的可读性。
2. 使用变量代替重复的计算:在循环中进行重复计算,可以将计算结果保存在变量中,以提高代码的效率。
3. 简化循环条件:在循环中进行判断时,可以将判断条件简化为更简洁的形式,以提高代码的可读性和效率。
4. 避免使用 magic number:代码中出现了一些硬编码的数字,可以使用 const 变量或宏定义来代替,以提高代码的可维护性。
下面是进行优化后的代码:
```
#include <stdio.h>
const int MAX_N = 100000000;
int main() {
int N, level = 1, sum = 1, preSum = 0;
scanf("%d", &N);
while (preSum + sum < N) {
preSum = sum;
sum = sum * 2 + 1;
level++;
}
if (N == 1) {
printf("1");
} else {
printf("%d", level);
}
return 0;
}
```
这样修改后的代码更加简洁明了,可读性和可维护性都有所提高,同时也提高了代码的效率。
#include<stdio.h> using namespace std; #include<cstring> #include <string.h> #include <stdbool.h> #pragma warning(disable:4996) int main() { int A[2005], Z[105] = {0}; int T, i, j, k, N, x,m; scanf("%d %d", &N, &x); for (i = 0; i < N; i++) { scanf("%d", A+i); } for (i = 0; i < N; i++) { A[i]--; } scanf("%d", &T); for (i = 0; i < T; i++) { memset(Z, 0, sizeof(Z)); scanf("%d %d", &k, &m); for (j=0,k--, m--; k <= m; k++) Z[A[k]] ? 0 : ((Z[A[k]] = 1), j++); printf("%d\n", j); } return 0; }
这段代码的问题不太明显,但是有几个可以进行优化的地方:
1. 删除无用的头文件:这段代码中包含了很多无用的头文件,可以删除它们,以减少编译时间和代码冗余。
2. 减少重复的代码:这段代码中出现了两次对输入数组 A 进行遍历的循环,可以将它们合并为一次。
3. 使用 const 关键字:如果数组 A 不需要被修改,可以将其声明为 const 数组,以提高代码的可读性和安全性。
4. 简化判断条件:在循环中进行判断时,可以将判断语句简化为更简洁的形式,以提高代码的可读性和效率。
5. 避免使用 magic number:代码中出现了一些硬编码的数字,可以使用 const 变量或宏定义来代替,以提高代码的可维护性。
下面是进行优化后的代码:
```
#include <cstdio>
#include <cstring>
const int MAX_N = 2005;
const int MAX_M = 105;
int main() {
int A[MAX_N], Z[MAX_M] = {0};
int T, N, x;
scanf("%d %d", &N, &x);
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
A[i]--; // 将 A 数组中的元素都减 1
}
scanf("%d", &T);
for (int i = 0; i < T; i++) {
memset(Z, 0, sizeof(Z));
int k, m;
scanf("%d %d", &k, &m);
int cnt = 0;
for (int j = k - 1; j <= m - 1; j++) {
if (!Z[A[j]]) {
Z[A[j]] = 1;
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}
```
这样修改后的代码更加简洁明了,可读性和可维护性都有所提高。
阅读全文