1.自然数拆解
看示例可知该数最小是1,我们从1开始搜,搜到sum为零为止,但是我们都是从上一个数加一开始试,所以用数组要考虑数组越界问题。这题还要求我们从小到大排序,dfs特性也是从1的道走到黑才会搜2;
#include#include using namespace std; int a[20]={1}; int n; void print(int a[],int n) { for(int i=1;i n; dfs(n,1);//此数要从1开始不然 数组越界 }
2水摊
这题一看跟迷宫题非常类似,但也不同,那就是搜完后标记不需要清除因为已经成为一块水摊,
而且此题的起点是每一个没有被搜过且为w的点所以要循环dfs调用一次后水摊数就++
#include#include using namespace std; char map[101][101]; int book[101][101];//标记数组 int ans=0; int n,m; int nex[8][2]={ {0,1},{1,0},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1} };//方向 void dfs(int x,int y) { book[x][y]=1;//标记这个水摊 for(int i=0;i<8;i++) if(map[x+nex[i][0]][y+nex[i][1]]=='W'&&book[x+nex[i][0]][y+nex[i][1]]==0)//此点没走过且为w dfs(x+nex[i][0],y+nex[i][1]);//寻找下一个w } int main() { cin >> n>>m; for(int i=0;i > map[i][j]; for(int i=0;i 3n皇后卡我时间,只能暴力出奇迹,打表了,我把每一个可以放皇后的位置它的对角线和列都变成不可以搜,这样每搜到一个点都可以排除很多不必要的点
#include#include using namespace std; int ans; int sum; int a[15][15]={0}; int book[15][15]={0}; void print(int a[][15],int n)//打印 { for(int i=1;i<=n;i++ ) { for(int j=1;j<=n;j++) if(a[i][j]) cout<< j<<' '; } cout << endl; } int place(int i,int j,int n)//位置可以放就对该点的列标和对角线进行标记 { if(book[i][j]==0)//这样下一个点只要没被标记过就是可以走的 { for(int c=1;c<=n;c++) book[c][j]++; int x=i-1,y=j-1; while(x>0&&y>0){book[x][y]++;x--;y--;} x=i-1,y=j+1; while(x>0&&y<=n){book[x][y]++;x--;y++;} x=i+1,y=j-1; while(x<=n&&y>0){book[x][y]++;x++;y--;} x=i+1,y=j+1; while(x<=n&&y<=n){book[x][y]++;x++;y++;} return 1; } else return 0; } void dfs(int i,int n) { int j; if(i>n) { ans++;//皇后放完+1 if(ans>0&&ans<=3)//打印前三个解 print(a,n); } else for(j=1;j<=n;j++)//从当前行寻找皇后 { if(place(i,j,n)) { a[i][j]=1; dfs(i+1,n);//往下搜 a[i][j]=0; for(int c=1;c<=n;c++)//此行往下都是回溯 book[c][j]--; int x=i-1,y=j-1; while(x>0&&y>0){book[x][y]--;x--;y--;} x=i-1,y=j+1; while(x>0&&y<=n){book[x][y]--;x--;y++;} x=i+1,y=j-1; while(x<=n&&y>0){book[x][y]--;x++;y--;} x=i+1,y=j+1; while(x<=n&&y<=n){book[x][y]--;x++;y++;} } } } int main() { int n; cin >> n; dfs(1,n); cout << ans; } 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)