甜玉米 发表于 2014-12-5 21:35:02

八皇后问题,跟着视频编的代码,但是有语法错误,大家帮忙看下哪里错了

本帖最后由 甜玉米 于 2014-12-7 10:12 编辑

#include <stdio.h>

int count=0;

int notDanger(int row,int j,(* chess))
{
      int i,k;
      int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;

      //判断列方向
      for(i=0;i<8;i++)
      {
                if(*(*(chess+i)+j) != 0)
                {
                        flag1=1;
                        break;
                }
      }

      //判断左上方
      for(i=row,k=j;i>=0 && k>=0;i--,k--)
      {
                if(*(*(chess+i)+k) != 0)
                {
                        flag2=1;
                        break;
                }
      }

      //判断右下方
      for(i=row,k=j;i<8 && k<8;i++,k++)
      {
                if(*(*(chess+i)+k) != 0)
                {
                        flag3=1;
                        break;
                }
      }

      //判断右上方
      for(i=row,k=j;i>=0 && k<8;i--,k++)
      {
                if(*(*(chess+i)+k) != 0)
                {
                        flag4=1;
                        break;
                }
      }

      //判断左下方
      for(i=row,k=j;i<8 && k>=0;i++,k--)
      {
                if(*(*(chess+i)+k) != 0)
                {
                        flag5=1;
                        break;
                }
      }

      if(flag1 || flag2 || flag3 || flag4 || flag5)
      {
                return 0;
      }
      else
      {
                return 1;
      }
}

//参数row:表示起始行
//参数n:表示列数
//参数(*chess):表示指向棋盘的每一行的指针
void EightQueen(int row,int n,int (*chess))
{
      
      int chess2,i,j;

      for(i=0;i<8;i++)
      {
                for(j=0;j<8;j++)
                {
                        chess2=chess;
                }
      }

      if(8==row)
      {
                printf("第 %d 种",count+1);
                for(i=0;i<8;i++)
                {
                        for(j=0;j<8;j++)
                        {
                              printf("%d ",*(*(chess2+i)+j));
                        }
                        printf("\n");
                }
                printf("\n");
                count ++;
      }
      else
      {

                for(j=0;j<n;j++)
                {
                        if(notDanger(row,j,chess))//判断是否危险
                        {
                              for(i=0;i<8;i++)
                              {
                                        *(*(chess2+row)+i)=0;
                              }
                              *(*(chess2+row)+j)=1;

                              EightQueen(row+1,n,chess2);
                        }
                }

      }
}

int main()
{
      int chess,i,j;
      
      for(i=0;i<8;i++)
      {
                for(j=0;j<8;j++)
                {
                        chess=0;
                }
      }

      EightQueen(0,8,chess);

      printf("总共有 %d 种解决方法!\n\n",count);

      return 0;
}

甜玉米 发表于 2014-12-5 21:36:14

错误提示:(就是找不来哪儿错了~笨呐)
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(5) : error C2059: syntax error : '('
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(5) : error C2090: function returns array
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(5) : error C2059: syntax error : ')'
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(6) : error C2143: syntax error : missing ';' before '{'
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(6) : error C2447: missing function header (old-style formal list?)
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(74) : error C2601: 'EightQueen' : local function definitions are illegal
F:\software_class\Data structure\°Ë»êoóÎêìa\Eight_queens.cpp(121) : error C2601: 'main' : local function definitions are illegal

甜玉米 发表于 2014-12-7 10:11:01

好吧……这么简单的错误居然没人看出来……

ustczzf 发表于 2015-1-3 17:28:27

我也是看着敲得,也出错了。求火眼金睛



// EightQueue.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>

int count = 0; //全局变量,总共多少种

int notDanger(int row, int j, int (*chess))//判断位置是否危险?
{
    int i, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
    int k; //表示位置

    //判断列方向是否有危险
    for(i=0; i<8; i++)
    {
      if(*(*(chess+i)+j) != 0)
      {
            flag1 = 1;
            break;
      }
    }
    //判断左上方
    for( i = row, k = j; i>=0 && k>=0; i--, k--)
    {
         if(*(*(chess+i)+k) != 0)
      {
            flag2 = 1;
            break;
      }
    }
    //判断右下方
    for( i = row, k = j; i<8 && k<8; i++, k++)
    {
         if(*(*(chess+i)+k) != 0)
      {
            flag3 = 1;
            break;
      }
    }
    //判断右上方
    for( i = row, k = j; i>=0 && k<0; i--, k++)
    {
         if(*(*(chess+i)+k) != 0)
      {
            flag4 = 1;
            break;
      }
    }
    //判断左下方
    for( i = row, k = j; i<8 && k>=0; i++, k--)
    {
         if(*(*(chess+i)+k) != 0)
      {
            flag5 = 1;
            break;
      }
    }

    if(flag1 || flag2 || flag3 || flag4 || flag5)
    {
      return 0;
    }
    else{
      return 1;
    }
}


//参数row:表示起始行
//参数n:标识列数
//参数(*chess):表示指向棋盘每一行的指针
void EightQueen(int row, int n, int (*chess))
{
    int chess2;
    int i, j;

    for( i = 0; i < 8; i++)
      for(j = 0; j < 8; j++)
            chess2 = chess;

    if( 8 == row )
    {
      printf("第 %d 种:\n", count+1);
      for( i = 0; i < 8; i++)
      {
            for(j = 0; j < 8; j++)
            {
                printf("%d ", *(*(chess2+i)+j));
            }
            printf("\n");
      }
      printf("\n");
      count++;
    }
    else
    {
      //判断这个位置是否有危险
      //如果没有危险?继续往下
      for( j=0; j < n; j++)
      {
            if(notDanger(row, j, chess)) //判断是否危险
            {
                for(i=0; i<8; i++)
                {
                  *(*(chess2+row)+i) = 0;//先把整行全部复制为0
                }
                *(*(chess2+row)+j) = 1;//标出皇后的位置

                EightQueen(row+1, n, chess2);
            }
      }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
        int chess;
    int i, j;


    for(i = 0; i < 8; i++)
    {
      for(j = 0; j < 8; j++)
      {
            chess = 0;
      }
    }

    EightQueen(0, 8, chess);
    printf("总共有 %d 种解决方法!\n\n", count);

    return 0;
}

ustczzf 发表于 2015-1-3 17:29:27

int notDanger(int row,int j,(* chess))

是不是缺了 int ?

ustczzf 发表于 2015-1-3 17:31:27

ustczzf 发表于 2015-1-3 17:28
我也是看着敲得,也出错了。求火眼金睛




//判断右上方
    for( i = row, k = j; i>=0 && k<0; i--, k++)
已调试出来,k<8.

甜玉米 发表于 2015-1-4 11:35:34

ustczzf 发表于 2015-1-3 17:29
int notDanger(int row,int j,(* chess))

是不是缺了 int ?

是的~有时候这种小错误挺误事的~~

一切随风罢 发表于 2015-4-2 17:57:59

#include <stdio.h>
int count=0;
int notDanger(int row,int j,int(* chess))//只需判断该点的所有的上方是否存在危险
{
      int i,k;
      int flag1=0,flag2=0,flag3=0;

      //判断列方向
      for(i=0;i<row;i++)
      {
                if(chess!=0)
                {
                        flag1=1;
                        break;
                }
      }

      //判断左上方
      for(i=row,k=j;i>=0 && k>=0;i--,k--)
      {
                if(chess!=0)
                {
                        flag2=1;
                        break;
                }
      }
      for(i=row,k=j;i>=0 && k<8;i--,k++)
      {
                if(chess!=0)
                {
                        flag3=1;
                        break;
                }
      }
      if(flag1 || flag2 || flag3 )
      {
                return 0;
      }
      else
      {
                return 1;
      }
}

//参数row:表示起始行
//参数n:表示列数
//参数(*chess):表示指向棋盘的每一行的指针
void EightQueen(int row,int n,int (*chess))
{
      
      int chess2,i,j;

      for(i=0;i<8;i++)
      {
                for(j=0;j<8;j++)
                {
                        chess2=chess;
                }
      }
      if(row==8)
      {
                printf("第 %d 种\n",count+1);
                for(i=0;i<8;i++)
                {
                        for(j=0;j<8;j++)
                        {
                              printf("%d ",chess2);
                        }
                        printf("\n");
                }
                printf("\n");
                count ++;
      }
      else
      {
                for(j=0;j<n;j++)
                {
                        if(notDanger(row,j,chess))//判断是否危险
                        {
                              for(i=0;i<8;i++)
                              {
                                       chess2=0;// *(*(chess2+row)+i)=0;
                              }
                              chess2=1;
                              EightQueen(row+1,n,chess2);
                        }
                }

      }
}
void main()
{
      int chess,i,j;
      for(i=0;i<8;i++)
      {
                for(j=0;j<8;j++)
                {
                        chess=0;
                }
      }
      EightQueen(0,8,chess);
      printf("总共有 %d 种解决方法!\n\n",count);
}
我觉得这样更简单

蓝色枫叶 发表于 2015-4-20 14:16:29

int notDanger(int row,int j,(* chess))
最后少了一个int

d5zhao 发表于 2015-4-21 00:19:08

顶一下!!!!挣鱼币学习

d5zhao 发表于 2015-4-21 00:22:15

顶一下!!!!挣鱼币学习

laishiba 发表于 2015-4-27 20:48:43

可以看下

angel2015 发表于 2015-4-28 02:23:39

k2012 发表于 2015-4-28 18:27:12

感谢楼主分享

likeangel 发表于 2015-4-28 18:28:07

k2012 发表于 2015-4-28 21:25:10

谢谢分享,祝君好运.

大头鱼 发表于 2016-12-15 00:16:06

zh
页: [1]
查看完整版本: 八皇后问题,跟着视频编的代码,但是有语法错误,大家帮忙看下哪里错了