c++二维数组标记深搜WA求调,玄关
查看原帖
c++二维数组标记深搜WA求调,玄关
705296
miffy_123楼主2023/11/5 21:07

下面是本蒟蒻的代码 十分侮辱各位dalao的眼睛

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 2147483646
#define inf 9223372036854775806
#define rep(i,o,p) for(int (i)=(o);(i)<=(p);(i)++)
#define per(i,o,p) for(int (i)=(o);(i)>=(p);(i)--)
#define pl putchar('\n');
int read(){
	int f=1,k=0;
	char c;
	c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		k=(k<<1)+(k<<3)+(c^48);
		c=getchar();
	}
	return f*k;
}
void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
int a[20],n;
bool ok[20][20];
int ans=0;
void dfs(int x){
	if(x>n){
		if(ans<3){
			rep(i,1,n){
				write(a[i]);
				putchar(' ');
			}
			pl
		}
		ans++;
		return;
	}
	rep(i,1,n){
		if(ok[x][i]){
			int k1=x,k2=i;
			while(k1&&k2){
				k1--;
				k2--;
			}
			k1++;
			k2++;
			while(k1>0&&k2>0&&k1<=n&&k2<=n){
				ok[k1][k2]=false;
				k1++;
				k2++;
			}
			k1=x;
			k2=i;
			while(k1>0&&k2<=n){
				k1--;
				k2++;
			}
			k1++;
			k2--;
			while(k1>0&&k2>0&&k1<=n&&k2<=n){
				ok[k1][k2]=false;
				k1++;
				k2--;
			}
			rep(k,1,n){
				ok[x][k]=false;
			}
			rep(k,1,n){
				ok[k][i]=false;
			}
			a[x]=i;
			dfs(x+1);
			k1=x;
			k2=i;
			while(k1&&k2){
				k1--;
				k2--;
			}
			k1++;
			k2++;
			while(k1>0&&k2>0&&k1<=n&&k2<=n){
				ok[k1][k2]=true;
				k1++;
				k2++;
			}
			k1=x;
			k2=i;
			while(k1>0&&k2<=n){
				k1--;
				k2++;
			}
			k1++;
			k2--;
			while(k1>0&&k2>0&&k1<=n&&k2<=n){
				ok[k1][k2]=true;
				k1++;
				k2--;
			}
			rep(k,1,n){
				ok[x][k]=true;
			}
			rep(k,1,n){
				ok[k][i]=true;
			}
		}
	}
	return;
}
int main(){
    n=read();
	rep(i,1,n){
		rep(j,1,n){
			ok[i][j]=true;
		}
	} 
	dfs(1);
	write(ans);
    return 0;
  //若各位dalao看出问题,对本题有帮助的话,可以私信或在本帖@我。
}
2023/11/5 21:07
加载中...