C++ 43行unordered_set回溯法,100%通过

Sudoku-Java

http://www.nowcoder.com/questionTerminal/78a1a4ebe8a34c93aac006c44f6bf8a1

#include<iostream>
#include<unordered_set>
using namespace std;
bool flag=false;
void dfs(int vec[][9],int i=0,int j=0){
    if(i==9){
        flag=true;
        return;
    }
    if(vec[i][j]==0){
        unordered_set<int> st;
        for(int m=0;m<9;m++){
            st.insert(vec[i][m]);
            st.insert(vec[m][j]);
        }
        for(int m=i/3*3;m<i/3*3+3;m++)
            for(int n=j/3*3;n<j/3*3+3;n++)
                st.insert(vec[m][n]);
        for(int m=1;m<=9;m++){
           if(!flag&&st.find(m)==st.end()){
               vec[i][j]=m;
               dfs(vec,i+j/8,(j+1)%9);
           }
        }
        if(!flag){
            vec[i][j]=0;
            return;
        }
     }else  dfs(vec,i+j/8,(j+1)%9);

}
int main(){
   int vec[9][9]{};
    for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)  
            cin>>vec[i][j];
    dfs(vec);
    for(int i=0;i<9;i++){
        for(int j=0;j<8;j++)  cout<<vec[i][j]<<" ";
        cout<<vec[i][8]<<endl;
    }
    return 0;
}
全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务