n=4 WA
查看原帖
n=4 WA
162133
_gcl楼主2021/10/9 16:31

n=4不对。求助

#include<bits/stdc++.h>
using namespace std;
const int N=907;
int prime[N],path[17][17],dirx[4]={1,0,-1,0},diry[4]={0,1,0,-1},cnt,ans=999999,last[50][50],step;
bool st[N],is_prime[N];

void get_prime(int n)
{
	memset(is_prime,false,sizeof is_prime);
	
	is_prime[1]=true;
	
	for(int i=2;i<=n;i++)
	{
		if(!is_prime[i])
		{
			prime[++cnt]=i;
		}
		for(int j=1;prime[j]<=n/i;j++)
		{
			is_prime[prime[j]*i]=true;
			if(i%prime[j]==0)break;
		}
	}
}

int n;
void dfs(int x,int y)
{
	if(y==n+1&&x==2)
	{	
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
				{
					cout<<path[i][j]<<" ";
				}
				cout<<endl;
			}
			exit(0);
	}
			
		if(y==1)
        {
        	for(int i=1;i<=n*n;i++)
        	{
        		if(!path[y][x-1]||!is_prime[path[y][x-1]+i]&&!st[i])
            	{   
            		st[i]=1;
            		path[y][x]=i;
            		if(x==n)dfs(1,y+1);
        		    else dfs(x+1,y);
        		    st[i]=0;
        		    path[y][x]=0;
            	}
        	}
        }
        
        if(x==1)
        {
        	for(int i=1;i<=n*n;i++)
        	{
        		if(!is_prime[path[y-1][x]+i]&&!st[i])
            	{
            		st[i]=1;
            		path[y][x]=i;
            		if(y==n)dfs(2,2);
        		    else dfs(x,y+1);
        		    st[i]=0;
        		    path[y][x]=0;
            	}
        	}
        }
        
        else
        {
        	for(int i=n*n;i>=2;i--)
			{
				if(!st[i])
				{			
						if(path[y-1][x])
					{
						if(is_prime[path[y-1][x]+i])continue;
				    }
					
					if(path[y+1][x])
					{
						if(is_prime[path[y+1][x]+i])continue;
					}
					
					if(path[y][x-1])
					{
						if(is_prime[path[y][x-1]+i])continue;
					}
					
					if(path[y][x+1])
					{
						if(is_prime[path[y][x+1]+i])continue;
					}
					
					if(!path[y][x])	
					{
						st[i]=1;
						path[y][x]=i;
						int memo=0;
						if(x==n)dfs(2,y+1);
						else dfs(x+1,y);
						st[i]=0;
						path[y][x]=0;
					}
				}
			}
    	}
		
        

}

int main()
{
	cin>>n;
	st[1]=1;
	path[1][1]=1;
	
	get_prime(300);
	
	if(n==1||n==3)
	{
		cout<<"NO";
		return 0;
	}
	
	dfs(2,1);
	return 0;
} 
2021/10/9 16:31
加载中...