查看: 1527|回復: 2
打印 上一主題 下一主題

寒訓 01/29 基礎班 範例代碼

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    樓主
    發表於 2015-1-31 09:37:13 | 顯示全部樓層
    [C++] 純文本查看 復制代碼
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    #include<set>
    using namespace std;
    
    int map[9][9];
    int N,NN;
    bool check()
    {
    	set<int> s;
    	
    	for(int i=0;i<NN;++i)
    	{
    		//line
    		s.clear();
    		for(int j=0;j<NN;++j)
    		{
    			if( map[i][j] != 0 )
    				if( s.find( map[i][j] ) == s.end() )
    					s.insert(map[i][j]);
    				else
    					return false;
    		}
    		//row
    		s.clear();
    		for(int j=0;j<NN;++j)
    		{
    			if( map[j][i] != 0 )
    				if( s.find( map[j][i] ) == s.end() )
    					s.insert(map[j][i]);
    				else
    					return false;
    		}
    	}
    	//block
    	for(int i=0;i<N;++i)
    		for(int j=0;j<N;++j)
    		{
    			s.clear();
    			for(int k=0;k<N*N;++k)
    			{
    				int I = i*N + k/N;
    				int J = j*N + k%N;
    				if( map[I][J] != 0 )
    					if( s.find( map[I][J] ) == s.end() )
    						s.insert(map[I][J]);
    					else
    						return false;
    			}
    		}
    	return true;
    }
    bool dfs(int id)
    {
    	
    	if( id == NN*NN )
    	{
    		if( check() )
    		{
    			for(int i=0;i<NN;++i)
    			{
    				for(int j=0;j<NN;++j)
    					cout<<map[i][j]<<' ';
    				cout<<'\n';
    			}
    			return true;
    		}
    		return false;
    	}
    	int I = id/NN;
    	int J = id%NN;
    	if( map[I][J] )
    		return dfs(id+1);
    	for(int i=1;i<=NN;++i)
    	{
    		map[I][J]=i;
    		if( check() )
    			if( dfs(id+1) )
    				return true;
    		map[I][J]=0;
    	}
    	return false;
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	while(cin>>N)
    	{
    		NN=N*N;
    		for(int i=0;i<NN;++i)
    		{
    			for(int j=0;j<NN;++j)
    			{
    				cin>>map[i][j];
    			}
    		}
    		if(!dfs(0))
    			cout<<"NO SOLUTION\n";
    	}
    	return 0;
    }
    
    回復 支持 1 反對 0

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表