Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 04:34   #1
xamelion
Пользователь
 
Регистрация: 25.12.2009
Сообщений: 11
Вопрос шахматная доска

Здравствуйте!
Есть задача: дана шахматная доска размером NxN, нужно расставить N ферзей таким образом, чтобы они не атаковали друг друга.
Нашёл код, но при при компиляции выдаёт ошибку: fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory Error executing cl.exe. (фатальная ошибка C1083: не может открыться включенный файл: ''stdafx.h'').
Подскажите пожалуйста, как это можно исправить
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
void Initialization(int n, int ***x);
void Destruction(int n, int **x);
bool Queen(int n, int **x);
void Placement(int n, int **a, int *p, int *h, int *du, 
               int *dd, int i=0, int j=0);
 
int _tmain(int argc, _TCHAR* argv[]){
  int n, i, j;
  bool otv;
  int **mas;
  printf("Введите размер шахматной доски n : ");
  scanf ("%d",&n);
  Initialization(n,&mas);
  otv = Queen(n,mas);
  if ( otv ) printf("Правильное размещение найдено\n");
  else printf("Правильного размещения не найдено\n");
  Destruction(n,mas);
  system("pause");
  return 0;
}
 
//инициализация поля шахматной доски
void Initialization(int n, int ***x){ 
  *x = new int*[n]; 
  for (int i = 0 ; i < n; i++ ){
    (*x)[i] = new int[n];
    for (int j = 0 ; j < n ; j++ )
      (*x)[i][j] = 0;
  }
} 
 
//вывод найденной расстановки в файл
void Destruction(int n, int **x){ 
  FILE *f;
  if( ( f = fopen("out.txt","w") ) == NULL ){
    printf("Файл out.txt не может быть открыт для записи");
  }
    else{
      fprintf(f,"%d\n",n);
      for (int i = 0 ; i < n; i++ ){
        for (int j = 0 ; j < n ; j++ )
          fprintf(f,"%2d",x[i][j]);
        fprintf(f,"\n");
      }
    }
  for (int i = 0 ; i < n; i++ )
    delete [] x[i];
  delete [] x;
} 
 
//проверка возможности постановки ферзя
bool Queen(int n, int **x){
  bool rez = false;
  int *p, *h, *du, *dd;
  p = new int[n];
  h = new int[n];
  du = new int[2 * n - 1];
  dd = new int[2 * n - 1];
  for ( int i = 0 ; i < n ; i++ )
    p[i] = h[i] = 0;
  for ( int i = 0 ; i < (2 * n - 1) ; i++ )
    du[i] = dd[i] = 0;
  Placement(n,x,p,h,du,dd);
  if ( h[0] != 0 ) rez = true;
  delete [] dd, du, h, p;
  return rez;
}
 
//описание функции расстановки ферзей
void Placement(int n, int **a, int *p, int *h, int *du, 
               int *dd, int i, int j){
  if ( j >= 0 && j < n )
    if ( i < n )
      if (h[i]==0 && du[i+j] == 0 && dd[n+i-j-1] == 0 ) {
        h[i] = 1;
        du[i+j] = 1;
        dd[n+i-j-1] = 1;
        p[j] = i;
        a[i][j] = 1;
        Placement(n,a,p,h,du,dd,0,j+1);
      }
      else
        Placement(n,a,p,h,du,dd,i+1,j);
    else
      if ( j > 0 ) {
        h[p[j-1]] = 0;
        du[p[j-1]+j-1] = 0;
        dd[n+p[j-1]-(j-1)-1] = 0;
        a[p[j-1]][j-1] = 0;
        Placement(n,a,p,h,du,dd,p[j-1]+1,j-1);
      }
}
Вложения
Тип файла: rar листинг.rar (1.0 Кб, 9 просмотров)
xamelion вне форума Ответить с цитированием
Старый 13.02.2012, 15:12   #2
MrCold
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

Цитата:
Cannot open include file: 'stdafx.h':
Значит уберите строчку :
Код:
#include "stdafx.h"
MrCold вне форума Ответить с цитированием
Старый 13.02.2012, 18:32   #3
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

вспомнились видеоуроки по с++... вот держи... решает такую же задачу...
Код:
// Урок 27
#include <iostream>
using namespace std;

int board[8][8];

void setQueen(int i, int j)
{
  for (int x = 0; x < 8; ++x)
  {
    ++board[x][j];
    ++board[i][x];
    int foo;
    foo = j - i + x;
    if (foo >= 0 && foo < 8)
      ++board[x][foo];
    foo = j + i - x;
    if (foo >= 0 && foo < 8)
      ++board[x][foo];
  }
  board[i][j] = -1;
}

void resetQueen(int i, int j)
{
  for (int x = 0; x < 8; ++x)
  {
    --board[x][j];
    --board[i][x];
    int foo;
    foo = j - i + x;
    if (foo >= 0 && foo < 8)
      --board[x][foo];
    foo = j + i - x;
    if (foo >= 0 && foo < 8)
      --board[x][foo];
  }
  board[i][j] = 0;
}

bool tryQueen(int i)
{
  bool result = false;
  for (int j = 0; j < 8; ++j)
  {
    if (board[i][j] == 0)
    {
      setQueen(i, j);
      if (i == 7)
	result = true;
      else
      {
	if (!(result = tryQueen(i + 1)))
	  resetQueen(i, j);
      }
    }
    if (result)
      break;
  }
  return result;
}

int main()
{
  for (int i = 0; i < 8; ++i)
    for (int j = 0; j < 8; ++j)
      board[i][j] = 0;
  tryQueen(0);
  for (int i = 0; i < 8; ++i)
  {
    for (int j = 0; j < 8; ++j)
    {
      if (board[i][j] == -1)
	cout << "[]";
      else
	cout << ". ";
    }
    cout << endl;
  }
}
а по поводу твоего... попробуй впихнуть его
Код:
#include <stdafx.h>
если при ковычках "" то он насколько я помю должен содержаться в папке с кодом, а так лежит с файлами в библиотеке... ии же почитай что это за библиотека... быть может это собственно ручно написаный файл... и подключается к проекту...
пишу код не только за печеньки

Последний раз редактировалось VIK_aka_TOR; 13.02.2012 в 18:35.
VIK_aka_TOR вне форума Ответить с цитированием
Старый 14.02.2012, 16:34   #4
xamelion
Пользователь
 
Регистрация: 25.12.2009
Сообщений: 11
По умолчанию

MrCold, если убрать строчку : #include "stdafx.h"
выдаёт ошибки в строках

Код:
#include <iostream>
using namespace std;
void Initialization(int n, int ***x);
void Destruction(int n, int **x);
bool Queen(int n, int **x);
void Placement(int n, int **a, int *p, int *h, int *du, 
               int *dd, int i=0, int j=0);
 
int _tmain(int argc, _TCHAR* argv[]){    // ошибка 1
  int n, i, j;
  bool otv;
  int **mas;
  printf("Введите размер шахматной доски n : ");
  scanf ("%d",&n);
  Initialization(n,&mas);
  otv = Queen(n,mas);
  if ( otv ) printf("Правильное размещение найдено\n");
  else printf("Правильного размещения не найдено\n");
  Destruction(n,mas);
  system("pause");
  return 0;
}
 

 

 
//проверка возможности постановки ферзя
bool Queen(int n, int **x){
  bool rez = false;
  int *p, *h, *du, *dd;
  p = new int[n];
  h = new int[n];
  du = new int[2 * n - 1];
  dd = new int[2 * n - 1];
  for ( int i = 0 ; i < n ; i++ )           // ошибка 3
    p[i] = h[i] = 0;
  for ( int i = 0 ; i < (2 * n - 1) ; i++ )  // ошибка 2
    du[i] = dd[i] = 0;
  Placement(n,x,p,h,du,dd);
  if ( h[0] != 0 ) rez = true;
  delete [] dd, du, h, p;
  return rez;
}
Ошибки
1: error C2061: syntax error : identifier '_TCHAR'
2: error C2374: 'i' : redefinition; multiple initialization
3: see declaration of 'i'
xamelion вне форума Ответить с цитированием
Старый 14.02.2012, 17:37   #5
MrCold
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

Строки
Код:
#include "stdafx.h"
и
Код:
int _tmain(int argc, _TCHAR* argv[])
нужны вам если работаете в VisualStudio , в
оболочке CLR. Иначе просто записываете не
Код:
int _tmain(int argc, _TCHAR* argv[])
а
Код:
int   main()
MrCold вне форума Ответить с цитированием
Старый 14.02.2012, 17:47   #6
MrCold
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

Цитата:
int _tmain(int argc, _TCHAR* argv[]){ // ошибка 1
int n, i, j;
bool otv;
int **mas;
Код:
  int n, i, j;    //      здесь переменные  i , j   вообще не  нужны .
MrCold вне форума Ответить с цитированием
Старый 14.02.2012, 17:55   #7
MrCold
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

Цитата:
for ( int i = 0 ; i < n ; i++ ) // ошибка 3
p[i] = h[i] = 0;
for ( int i = 0 ; i < (2 * n - 1) ; i++ ) // ошибка 2
du[i] = dd[i] = 0;
Раз выдает ошибку ,уберите из цикла for объявление типа
Цитата:
//проверка возможности постановки ферзя
bool Queen(int n, int **x){
bool rez = false;
int i , *p, *h, *du, *dd;// объявим здесь
p = new int[n];
h = new int[n];
du = new int[2 * n - 1];
dd = new int[2 * n - 1];
for ( i = 0 ; i < n ; i++ )
p[i] = h[i] = 0;
for ( i = 0 ; i < (2 * n - 1) ; i++ )
du[i] = dd[i] = 0;
Placement(n,x,p,h,du,dd);
if ( h[0] != 0 ) rez = true;
delete [] dd, du, h, p;
return rez;
}
MrCold вне форума Ответить с цитированием
Старый 15.02.2012, 18:48   #8
xamelion
Пользователь
 
Регистрация: 25.12.2009
Сообщений: 11
По умолчанию

MrCold, спасибо! Заработало!


А вот как увидеть расстановку самих ферзей? В Visual C++ нужно текстовый файл какой-то создать?
Изображения
Тип файла: jpg 777777.JPG (45.8 Кб, 139 просмотров)
xamelion вне форума Ответить с цитированием
Старый 15.02.2012, 21:41   #9
MrCold
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

По идее файл создается автоматом .
Код:
 f = fopen("out.txt","w")
Он будет расположен в том же каталоге ,что и программа .
xamelion,
можно самому пустой файл создать,для удобства, в Блокноте ,сохранить
и указать путь в коде, тот по которому файл сохранен ,например:
Код:
 f = fopen("С:\\Users\\Documents\\out.txt","w")
Мне кажется так легче найти его и просмотреть содержимое .
MrCold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шахматная доска revaldo666 Общие вопросы C/C++ 4 11.01.2011 11:25
Шахматная доска!!! Евгений19 Помощь студентам 3 08.03.2010 20:02
Шахматная доска Настенька..Блонди Паскаль, Turbo Pascal, PascalABC.NET 2 15.05.2009 23:26
Шахматная доска Shevali Помощь студентам 4 03.04.2009 20:22
шахматная доска Irisha_17_85 Паскаль, Turbo Pascal, PascalABC.NET 4 04.11.2008 10:50