一周的总结

一周的总结
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;
}

还未完全理解海洋的问题,日后回来补;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值