dfs加pta神仙题吃火锅

王姐大逃亡

数量一个由 '1'(陆地)和 '0'(水)组成的的游戏地图中,王姐必须保证在陆地上面,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0''1'

一道简单的dfs,递归时注意技巧,判断方向。

class Solution {
public:
    int n,m;
    void dfs(vector<vector<char>>& grid,int r,int c)
    {
        //将从该点出发的所有点标记为0,如果还有其他点的话,num++;
        grid[r][c] = '0';
        if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
        if (r + 1 < n && grid[r+1][c] == '1') dfs(grid, r + 1, c);
        if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
        if (c + 1 < m && grid[r][c+1] == '1') dfs(grid, r, c + 1);
    }

    int numIslands(vector<vector<char>>& grid) {
        n = grid.size();
         m = grid[0].size();
         int num = 0;
         for(int i = 0;i < n;i ++)
         {
            for(int j = 0;j < m;j ++)
            {
                if(grid[i][j] == '1')
                {
                    num ++ ;
                    dfs(grid,i,j);
                }
            }
         }
         return num;
    }

};

阿晨打地鼠

n 个洞,其中一些彼此相连,另一些没有相连。如果洞 a 与洞 b 直接相连,且洞 b 与洞 c 直接相连,那么洞 a 与洞 c 间接相连。

地道 是一组直接或间接相连的洞,组内不含其他没有相连的洞。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个洞和第 j 个洞直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 地道 的数量。

示例 1:

img

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

示例 2:

img

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

提示:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j]10
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

理解一些=下vector<vector>相当于是一个二维数组,这道题用dfs注意时刻进行标记就行

class Solution {
public:
   		void dfs(vector<vector<int>>& isConnected, vector<int>& visited, int provinces, int i) {
        for (int j = 0; j < provinces; j++) {
            if (isConnected[i][j] == 1 && !visited[j]) {
                visited[j] = 1;
                dfs(isConnected, visited, provinces, j);
            }
        }
    }

    int findCircleNum(vector<vector<int>>& isConnected) {
        int provinces = isConnected.size();
        vector<int> visited(provinces);
        int circles = 0;
        for (int i = 0; i < provinces; i++) {
            if (!visited[i]) {
                dfs(isConnected, visited, provinces, i);
                circles++;
            }
        }
        return circles;
    }
};

L1-064 估值一亿的AI核心代码(阴间题)

AI.jpg

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 Ime 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:

6
Hello ?
 Good to chat   with you
can   you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

输出样例:

Hello ?
AI: hello!
 Good to chat   with you
AI: good to chat with you
can   you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

一起来学习学习

// 无论用户说什么,首先把对方说的话在一行中原样打印出来;
// 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
// 把原文中所有大写英文字母变成小写,除了 I;
// 把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
// 把原文中所有独立的 I 和 me 换成 you;
// 把原文中所有的问号 ? 换成惊叹号 !;
// 在一行中输出替换后的句子作为 AI 的回答。
#include<iostream>

using namespace std;

string a,b; //a是原字符串,b是修改后的字符串 

//点睛之笔
int ch(string s,int x) // 判断字符是哪一类 
{
	if(s[x]>='a' && s[x]<='z') return 1;
	else if(s[x]>='A' && s[x]<='Z') return 2;
	else if(s[x]>='0' && s[x]<='9') return 3;
	else if(s[x]==' ') return 4;
	else return 5; // 除空格以外的标点符号
}

int check(int x,int y) // 判断是否满足"独立的字符串" 
{
   if((x<0 || b[x]==' ' || ch(b,x)==5 ) && (y>=b.size() || b[y]==' ' || ch(b,y)==5))	 
     return 1;
   return 0;
}

int main()
{
	int N;
	cin>>N;
	getchar();
	while(N--)
	{
		getline(cin,a);
		cout << a << endl << "AI: ";
		int l = 0,r = a.size() - 1;
		while(a[l]==' ') l++; // 去掉全部首空格 
		while(a[r]==' ') r--; // 去掉全部尾空格 
		for(int i=l; i<=r; i++) // 从l~r循环,这样就相当于去掉全部首尾空格了 
		{
			if(ch(a,i) == 2 && a[i] != 'I') // 大写变小写 
			   b+=a[i]+32; 
			else if(a[i] == '?')  // ?变! 
			   b+='!';
			else if(a[i] == ' ' && (a[i+1] == ' '||ch(a,i+1) == 5)) 
                // 去掉多余空格(单词间的空格、标点符号前的空格) 
			   continue;
			else
			   b+=a[i];   // 其他字符
		}
		for(int i=0; i<b.size(); i++)
		{
			if(b[i]=='I' && check(i-1,i+1))
			  cout<<"you";
			else if(b.substr(i,2) == "me" && check(i-1,i+2)) 
			// b.substr(i,2)代表截取b字符串从i下标开始的两个字符 
			  cout<<"you", i++;
			else if(b.substr(i,7) == "can you" && check(i-1,i+7))    
			  cout<<"I can", i+=6;
			else if(b.substr(i,9) == "could you" && check(i-1,i+9))
			  cout<<"I could", i+=8;
			else
			  cout<<b[i];    
		}
		cout<<endl;
		b=""; //将b更新为空字符串 
	}	
}

L1-070 吃火锅 (15 分)

chg.jpg

以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1

输入格式:

输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。

输出格式:

首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。

如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 -_-#

输入样例 1:

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

输出样例 1:

5
3 2

输入样例 2:

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

输出样例 2:

5
-_-#

strstr()函数用于找到子串在一个字符串中第一次出现的位置,在string.h头文件中。
例如:char *strstr(const char *str1, const char *str2)

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
using namespace std;
int main(){
	char str[101];
	int num = 0,sum = 0,first = -1;
	while(1){
		cin.getline(str,100);
		if(strcmp(str,".") == 0){
			break;
		}
		num++;
		char * res = strstr(str,"chi1 huo3 guo1");
		if(res != NULL){
			sum++;
			if(first == -1){
				first = num;
			}
		}
	}
	cout<<num<<endl;
	if(sum == 0){
		cout<<"-_-#"<<endl;
	}else{
		cout<<first<<" "<<sum<<endl;
	}
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值