1 条题解

  • 0
    @ 2023-6-11 12:20:41

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    char mp[10][10];
    int r[100][3];  //  存放*的坐标 
    int n,cnt,num;
    // 判断在x,y位置放置字符k 是否OK 
    bool is_ok(int x,int y,char k){
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(i==x&&mp[i][j]==k)return false;
    			if(j==y&&mp[i][j]==k)return false;
    			if(i-j==x-y&&mp[i][j]==k)return false;
    			if(i+j==x+y&&mp[i][j]==k)return false;
    		}		
    	}
    	return true;	
    }
    void prt(){
    	cout<<"---------------"<<endl;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			cout<<mp[i][j];		
    		}
    		cout<<endl;
    	}	
    }
    // 向以 下标为 k 的 r数组的坐标 的方格 填数 
    void dfs(int k){	
    	for(int i=1;i<=n;i++){
    		if(is_ok(r[k][1],r[k][2],i+'0')){
    			mp[r[k][1]][r[k][2]]=i+'0';
    			if(k==num){
    				cnt++;
    				//prt();
    				//return;
    			}
    			else			
    				dfs(k+1);
    			mp[r[k][1]][r[k][2]]=0;
    		}
    	}
    }
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			cin>>mp[i][j];
    			if(mp[i][j]=='*'){
    				r[++num][1]=i;
    				r[num][2]=j;
    			}			
    		}
    
    	}
    	dfs(1);
    	cout<<cnt;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    2562
    时间
    1000ms
    内存
    16MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者