|
|
30鱼币
洛谷p1219
题目链接
n∈[1,5]的时候都可以正常输出,从6开始,运行一半就返回3221225477 (读或写了野指针指向的内存)
我寻思也没用指针啊,实在是找不到问题,大佬们帮忙看下
代码如下: (c++)
- #include <bits/stdc++.h>
- #define int ll
- using ll=long long;
- using namespace std;
- int n,b[107],a[107][107],cnt;
- void seta(){
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++)
- a[i][j]=1;
- }
- void cap(int x,int i){
- if(x < 1 || x > n || i < 1 || i > n) return; // 检查是否越界
- for(int j=1;j<=n;j++){
- a[x][j]=0;
- a[j][i]=0;
- }
- for(int j=0,k=0;(x+j)<=n&&(i+k)<=n;k++,j++){
- a[x+j][i+k]=0;
- }
- for(int j=0,k=0;(x-j)<=n&&(i+k)<=n;k++,j++){
- a[x-j][i+k]=0;
- }
- for(int j=0,k=0;(x-j)>=1&&(i-k)>=1;j++,++k){
- a[x-j][i-k]=0;
- }
- for(int j=0,k=0;(x+j)>=1&&(i-k)>=1;j++,++k){
- a[x+j][i-k]=0;
- }
- }
- void dfs(int x){ //x=层数
- if(x>n){
- cnt++;
- if(cnt<=3){
- for(int i=1;i<=n;++i){
- printf("%d",b[i]);
- if(i!=n){
- putchar(' ');
- }
- }
- putchar('\n');
- }
- return;
- }
- for(int i=1;i<=n;i++){
- if(a[x][i]){ //合法
- b[x]=i;
- cap(x,i);
- dfs(x+1);
- }
- }
- return;
- }
- signed main(){
- scanf("%d",&n);
- for(int i=1;i<=n;i++){
- seta();
- b[1]=i;
- cap(1,i);
-
- dfs(2);
- }
-
- printf("%d",cnt);
-
- return 0;
- }
复制代码
好的,现在你给出了完整的代码。根据你提供的信息,问题可能出现在循环中的边界检查上。在你的代码中,你只检查了i和j是否超过了n,但是没有检查a是否超过了数组b的范围。
另外,你的代码中使用了递归来尝试不同的解决方案。但是,在每次递归调用结束后,你没有恢复棋盘的状态,这可能导致错误的结果。
为了解决以上问题,你可以将边界检查添加到seta()函数中,并在递归调用结束后恢复棋盘状态。
下面是修改后的代码示例:
- #include <iostream>
- #define int ll
- using ll = long long;
- using namespace std;
- int n, cnt;
- int b[10]; // 存储皇后所在的列号
- bool check(int t) {
- for (int i = 1; i < t; i++) {
- if (b[i] == b[t] || abs(b[i] - b[t]) == abs(i - t)) {
- return false; // 检查是否与之前的皇后冲突
- }
- }
- return true;
- }
- void seta(int t) {
- if (t > n) {
- cnt++;
- } else {
- for (int i = 1; i <= n; i++) {
- b[t] = i; // 将皇后放在第t行第i列
- if (check(t)) { // 检查是否与之前的皇后冲突
- seta(t + 1); // 递归放置下一个皇后
- }
- b[t] = 0; // 恢复棋盘状态
- }
- }
- }
- int main() {
- cin >> n;
- seta(1);
- cout << cnt << endl;
- return 0;
- }
复制代码
希望这个修改后的代码能够解决你的问题。如果还有其他问题,请随时向我提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
最佳答案
查看完整内容
好的,现在你给出了完整的代码。根据你提供的信息,问题可能出现在循环中的边界检查上。在你的代码中,你只检查了i和j是否超过了n,但是没有检查a是否超过了数组b的范围。
另外,你的代码中使用了递归来尝试不同的解决方案。但是,在每次递归调用结束后,你没有恢复棋盘的状态,这可能导致错误的结果。
为了解决以上问题,你可以将边界检查添加到seta()函数中,并在递归调用结束后恢复棋盘状态。
下面是修改后的代码 ...
|