Можно подсказать как оптимизировать задачу, иначе у меня одни и те же методы расставления считаются несколько раз, а также тайм лимит

Задача магараджа с асмп пока что еще не решена мной,

#include <bits/stdc++.h>
using namespace std;
int cnt=0,n,m;
bool check(vector <int> vec,int x,int y)
{
	bool flag=1;
	for(int k=1;k<=x-1;k++)
	{
		if(vec[k]==0) continue;
		if(abs(x-k)==abs(vec[k]-y) || y==vec[k] || (abs(x-k)==1 && abs(vec[k]-y)==2) || (abs(x-k)==2 && abs(vec[k]-y)==1))
		{
			flag=0;
			break;
		}
	}
	return flag;
}
void rec(vector<int> vec,int have,int pos)
{
	if(pos==n)
	{
		if(have==m)
		{
			cnt++;
		}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(check(vec,pos+1,i))
		{
			vec[pos+1]=0;
			rec(vec,have,pos+1);
			vec[pos+1]=i;
			rec(vec,have+1,pos+1);
		}
	}
}
int main()
{
	cin>>n>>m;
	vector <int> vec(n+1);
	rec(vec,0,0);
	cout<<cnt;
	return 0;
}

, написал такой код, вроде проходить должен, но завал

советую писать код через текст “как есть”, ибо на форуме поддерживается ряд языков разметок что может привести к путанице.

вот так выглядит текст "как есть" 

так код:

#include <bits/stdc++.h>
using namespace std;
int cnt=0,n,m;
bool check(vector vec,int x,int y)
{
bool flag=1;
for(int k=1;k<=x-1;k++)
{
if(vec[k]==0) continue;
if(abs(x-k)==abs(vec[k]-y) || y==vec[k] || (abs(x-k)==1 && abs(vec[k]-y)==2) || (abs(x-k)==2 && abs(vec[k]-y)==1))
{
flag=0;
break;
}
}
return flag;
}
void rec(vector vec,int have,int pos)
{
if(pos==n)
{
if(have==m)
{
cnt++;
}
return;
}
for(int i=1;i<=n;i++)
{
if(check(vec,pos+1,i))
{
vec[pos+1]=0;
rec(vec,have,pos+1);
vec[pos+1]=i;
rec(vec,have+1,pos+1);
}
}
}
int main()
{
cin>>n>>m;
vector vec(n+1);
rec(vec,0,0);
cout<<cnt;
return 0;
}

upd: ну согласитесь так код выглядит гораздо красивее и эстетичнее)))) к тому же будет легче скопировать весь код в одно нажатие благодаря, дающийся данным форматом, функции скопировать весь текст в одно нажатие

6 лайков

101. Магараджа , простите забыл ссылку приложить

Так у тебя же код не компилируется даже :question:

#include <bits/stdc++.h>
using namespace std;
int cnt=0,n,m;
bool check(vector <int> vec,int x,int y)
{
	bool flag=1;
	for(int k=1;k<=x-1;k++)
	{
		if(vec[k]==0) continue;
		if(abs(x-k)==abs(vec[k]-y) || y==vec[k] || (abs(x-k)==1 && abs(vec[k]-y)==2) || (abs(x-k)==2 && abs(vec[k]-y)==1))
		{
			flag=0;
			break;
		}
	}
	return flag;
}
void rec(vector<int> vec,int have,int pos)
{
	if(pos==n)
	{
		if(have==m)
		{
			cnt++;
		}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(check(vec,pos+1,i))
		{
			vec[pos+1]=0;
			rec(vec,have,pos+1);
			vec[pos+1]=i;
			rec(vec,have+1,pos+1);
		}
	}
}
int main()
{
	cin>>n>>m;
	vector <int> vec(n+1);
	rec(vec,0,0);
	cout<<cnt;
	return 0;
}

Можно спросить? Почему когда я вставляю код с vector <(int>) vec(n+1), у меня сохраняется только vector vec(n+1)

Извините за количество удаленных сообщений, просто код несколько раз переотправлял с интом, но выводился на этом форуме без <intа>

Выше сказали как можно код отправлять

#include <bits/stdc++.h>
using namespace std;
int cnt=0,n,m;
bool check(vector <int> vec,int x,int y)
{
	bool flag=1;
	for(int k=1;k<=x-1;k++)
	{
		if(vec[k]==0) continue;
		if(abs(x-k)==abs(vec[k]-y) || y==vec[k] || (abs(x-k)==1 && abs(vec[k]-y)==2) || (abs(x-k)==2 && abs(vec[k]-y)==1))
		{
			flag=0;
			break;
		}
	}
	return flag;
}
void rec(vector<int> vec,int have,int pos)
{
	if(pos==n)
	{
		if(have==m)
		{
			cnt++;
		}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(check(vec,pos+1,i))
		{
			vec[pos+1]=0;
			rec(vec,have,pos+1);
			vec[pos+1]=i;
			rec(vec,have+1,pos+1);
		}
	}
}
int main()
{
	cin>>n>>m;
	vector <int> vec(n+1);
	rec(vec,0,0);
	cout<<cnt;
	return 0;
}

Все, нашел функцию “как есть”, можно подсказку?

Попробуй сделать так чтобы vec не был параметром рекурсии, а был обьявлен глобально и просто изменялся