一周的总结
1.学习结构体中的大小比较
来源:
acw中的奖学金的题目
目的:判断整体的排列
1.按总分
2.按语文
3.按学号
bool operator <(const node &a) const
{ }
例子:
```cpp
struct student
{
int id,sum,a,b,c;
bool operator <(const node &t)const
{
if(sum!= t.sum)
return sum>t.sum;
if(a != t.a)
return a>t.a;
if(id != t.id)
return id<t.id;
}
}q[N];
2.dfs和bfs的问题;
1.什么是dfs;
深度优先;
2.什么是bfs;
广度优先;
/自己的实力还没有如此的厉害;
于是就先学的dfs;
也不是特别懂日后在补写一些;/
dfs的例题
1.oj上的
海洋问题
2.acm上的
棋盘的问题
、、其实我觉得叫N皇后更好,因为是八皇后的升级版。
先解八皇,问就是才做过一次。
```cpp
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,sum;
const int N = 15;
bool col[N], dg[N * 2], udg[N * 2];
int path[N],ans;
void dfs(int x)
{
if (x>n)
{
ans++;
if(ans<=3)
{
for(int i=1; i<=n; i++)
cout<<path[i]<<" ";
cout<<endl;
}
return;
}
for (int y = 1; y <= n; y ++)//开始放
if(!col[y] && !dg[x + y] && !udg[x - y + n])//判断他的列,他的该点对应的列、左斜对角线、右斜对角线都没有棋子,则可以放。
{
path[x] = y;
col[y] = dg[x + y] = udg[x - y + n] = true;//对应的列、左斜对角线、右斜对角线就棋子了
dfs(x + 1);
col[y] = dg[x + y] = udg[x - y + n] = false;//状态回滚
path[x] = 0;
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans;
return 0;
}
2.海洋问题
#include<bits/stdc++.h>
using namespace std;
int n;
char a[1010][1010]; //地图
int vis[1010][1010]={0}; //标记是否搜过
int d[4][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}}; //四个方向
int flag; //用于标记这个岛中是否被完全淹没
void dfs(int x, int y){
vis[x][y] = 1; //标记这个'#'被搜过。注意为什么可以放在这里
if(a[x][y+1]=='#' && a[x][y-1]=='#' && a[x+1][y]=='#' && a[x-1][y]=='#')
flag = 1; //上下左右都是陆地,不会淹没
for(int i = 0; i < 4; i++){ //继续DFS周围的陆地
int nx = x + d[i][0], ny = y + d[i][1];
//if(nx>=1 && nx<=n && ny>=1 && ny<=n && vis[nx][ny]==0 && a[nx][ny]=='#') //题目说边上都是水,所以不用这么写了
if(vis[nx][ny]==0 && a[nx][ny]=='#') //继续DFS未搜过的陆地,目的是标记它们
dfs(nx,ny);
}
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
int ans = 0 ;
for(int i = 1; i <= n; i++) //DFS所有像素点
for(int j = 1; j <= n; j++)
if(a[i][j]=='#' && vis[i][j]==0){
flag = 0;
dfs(i,j);
if(flag == 0) //这个岛全部被淹
ans++; //统计岛的数量
}
cout<<ans<<endl;
return 0;
}
还未完全理解海洋的问题,日后回来补;