C语言解决八皇后问题

zafzap1 2014-09-11 07:29:28


我的想法是这样的:
00 01 02 03 04 05 06 07
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
30 31 32 33 34 35 36 37
40 41 42 43 44 45 46 47
50 51 52 53 54 55 56 57
60 61 62 63 64 65 66 67
70 71 72 73 74 75 76 77

每个棋位对应上面的数字,然后就可以用一维数组处理二维棋盘了。
每次随机 选取一个棋位(就是皇后位置p[i]),然后划去相斥的棋位((abs(p[j]-p[i]))%11==0||(abs(p[j]-p[i]))%9==0||....)
然后一直这样循环。。

可是编写代码感觉好难。。。。


...全文
995 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2014-09-12
  • 打赏
  • 举报
回复
lz, N皇后问题是有公式的 : 当n mod 6 != 2 且 n mod 6 != 3时,有一个解为: 2,4,6,8,...,n,1,3,5,7,...,n-1 (n为偶数) 2,4,6,8,...,n-1,1,3,5,7,...,n (n为奇数) (上面序列第i个数为ai,表示在第i行ai列放一个皇后;... 省略的序列中,相邻两数以2递增。下同) 当n mod 6 == 2 或 n mod 6 == 3时,(当n为偶数,k=n/2;当n为奇数,k=(n-1)/2) k,k+2,k+4,...,n,2,4,...,k-2,k+3,k+5,...,n-1,1,3,5,...,k+1 (k为偶数,n为偶数) k,k+2,k+4,...,n-1,2,4,...,k-2,k+3,k+5,...,n-2,1,3,5,...,k+1,n (k为偶数,n为奇数) k,k+2,k+4,...,n-1,1,3,5,...,k-2,k+3,...,n,2,4,...,k+1 (k为奇数,n为偶数) k,k+2,k+4,...,n-2,1,3,5,...,k-2,k+3,...,n-1,2,4,...,k+1,n (k为奇数,n为奇数)
赵4老师 2014-09-12
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
赵4老师 2014-09-12
  • 打赏
  • 举报
回复
#include <stdio.h>
int d[8][8];
int n;
void queen8(int L) {
    int x,y;

    if (8==L) {
        n++;
        printf("%d\n",n);
        for (y=0;y<8;y++) {
            for (x=0;x<8;x++) {
//              printf("%d",d[y][x]);
                if (d[y][x]) printf("■");
                else         printf("□");
            }
            printf("\n");
        }
        return;
    }
    for (x=0;x<8;x++) {
        for (y=0;y<L;y++) {
            if  (              d[y][x      ]
             || (x-(L-y)>=0 && d[y][x-(L-y)])
             || (x+(L-y)< 8 && d[y][x+(L-y)]))
                break;
        }
        if (y>=L) {
            d[L][x]=1;
            queen8(L+1);
            d[L][x]=0;
        }
    }
}
int main() {
    int y,x;
    for (y=0;y<8;y++) {
        for (x=0;x<8;x++) {
            d[y][x]=0;
        }
    }
    queen8(0);
    return 0;
}
707wk 2014-09-11
  • 打赏
  • 举报
回复
仅供参考
#include<stdio.h>      //八皇后
int n=1;
int fun1(int b[])
{
    int j,m;
    for(j=0;j<7;j++)
        for(m=j+1;m<8;m++)
            if((b[m]-m)==(b[j]-j)||b[m]==b[j]||(b[m]+m)==(b[j]+j))return 0;
    return 1;
}
int fun(int b[])
{
int i,j;
for(b[7]=0;b[0]<8;b[7]++)
{
if(b[0]>=8)return 0;
for(i=7;i>0;i--)
    if(b[i]>=8){b[i]=0;b[i-1]++;}
if(fun1(b))
{
    printf("%d\n",n++);
    for(i=0;i<8;i++,printf("\n"))
        for(j=0;j<8;j++)
            if(b[i]!=j)printf("%2c",220);
            else printf("%2c",5);
}
}
}
int main()
{
    int b[8]={0};
    fun(b);
    getchar();
    return 0;
}
Falleyes 2014-09-11
  • 打赏
  • 举报
回复
一维数组表示二维数组,没问题,对不能放棋的地方设置标志,也没问题。 重要的是,把这些组合起来写成代码的最后还是你,楼主要耐下心来一点一点写完。
zafzap1 2014-09-11
  • 打赏
  • 举报
回复
来个大侠完善下
zafzap1 2014-09-11
  • 打赏
  • 举报
回复
#include<stdio.h> #include<stdlib.h> void initState(int p[]); void print(int p[]); int numOfPositive(int p[],int); void moveAway(int p[], int, int); int select(int p[], int ,int); int main() { int step =0; int selectPosition1; int selectPosition; int roomAvailable; int state[64]; initState(state); print(state); roomAvailable = numOfPositive(state, 64); while(roomAvailable > 0) { sleep(100); printf("%d",roomAvailable); srand( time(NULL) ); selectPosition1 = rand()%roomAvailable; selectPosition = select(state,64,selectPosition1); moveAway(state,64,selectPosition); roomAvailable = numOfPositive(state, 64); printf("%d",roomAvailable); step++; } printf("%d",step); return 0; } void initState(int p[]) { int i; int j; int k =0 ; for(i= 0; i<8; i++){ for(j=0; j<8; j++) { p[k]= 10*i + j; k++; } } } void print(int p[]) { int k = 0; while (k <64 ) { printf("%2d ",p[k]); if((k+1)%8==0) printf("\n"); k++; } } int numOfPositive(int p[],int m) { int i; int j = 0; for(i= 0; i<m; i++) { if(p[i]>-1) j++; } return j; } void moveAway(int p[], int m, int n) { int i; int j = p[n]/10 ; for(i= 0; i<m; i++) { int k = abs(p[i]-p[n]); int j = p[n]%10 ; if(k%10==0||k%9==0||k%11==0) p[i]=-1; if(p[i]/10 == j) p[i]=-1; } } int select(int p[],int m,int n) { int i; int j = -1; int k; for(i= 0; i<m; i++) { if(p[i]>-1) j++; if(j == n) { k = p[j]; break; } } return k; }

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧