bool dfs() { if(step+score>bound) { if(step+score<next) next=step+score; return false; } if(!score) { return true; path[step]=0; } for(int i=0;i<4;i++) if(path[step-1]!=dirt[rev[i]] && vaild(x+dx[i],y+dy[i])) { score-=num[s[x][y]][x][y]; s[x+dx[i]][y+dy[i]]=s[x][y]; s[x+=dx[i]][y+=dy[i]]=0; score+=num[s[x][y]][x][y]; path[step++]=dirt[i]; if(dfs()) return true; step--; score-=num[s[x][y]][x][y]; s[x-dx[i]][y-dy[i]]=s[x][y]; s[x-=dx[i]][y-=dy[i]]=0; score+=num[s[x][y]][x][y]; } return false; }
void solveNQueens(const int n, vector<int> & steps, vector<vector<string> > & res) { if (steps.size() == n) { vector<string> v; for (int i = 0; i < n; i++) { string tmp(n, '.'); tmp[steps[i]] = 'Q'; v.push_back(tmp); } res.push_back(v); return; } else { int row = steps.size(); for (int i = 0; i < n; i++) { //每走一步,都要看下当前step是否vaild if (vaild(row, i, steps)) { //对当前row的每个col进行遍历 steps.push_back(i); solveNQueens(n, steps, res); steps.pop_back(); } } } }
vector<string> restoreIpAddresses(string s) { vector<string> res; int len = s.size(); if(len < 4 && len > 12) return res; int point = 1; int cur = 1; for(int i = 0; i < 5; i++)dot.push_back(0); while(point < 4){ while(cur < len){ if(vaild(cur,point,len,s)){ dot[point] = cur; cur ++; break; } else{ if(cur - dot[point-1] > 3){ //point --; //cur = dot[point] + 1; break; } else cur ++; } } if(dot[point] == 0){ if(point == 1) break; else{ point --; cur = dot[point] + 1; dot[point] = 0; continue; } } if(point == 3 && dot[point] != 0){ point = 1; string temp; for(int i = 0;i < len;){ if(dot[point] == i){ temp += "."; point ++; } else{ temp += s[i]; i++; } } point --; res.push_back(temp); cur = dot[point] + 1; dot[point] = 0; //point --; continue; } point ++; } return res; }
inline int read(){int ret=0;char c=gc();while(vaild(c))ret=ret*10+c-'0',c=getchar();return ret;}
inline char gc(){char c=getchar();while(!vaild(c))c=getchar();return c;}