#include<iostream>#include<vector>usingnamespace std;constint N =110;int n, m;
string g[N];int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};bool st[N][N];int t =0;voiddfs(int x,int y){if(x == n -1&& y == m -1){
t =1;return;}for(int i =0; i <4; i++){int a = dx[i]+ x, b = dy[i]+ y;if(a >=0&& a < n && b >=0&& b < m &&!st[a][b]&&g[a][b]=='.'){
st[a][b]=true;dfs(a, b);}}}intmain(){
cin >> n >> m;for(int i =0; i < n; i++)cin >> g[i];dfs(0,0);if(t ==1)cout <<"Yes"<< endl;else cout <<"No"<< endl;}
P1162 填涂颜色
先把外面的0 全部设为3 (dfs)然后 再将所有0转为2 最后将3改为0
#include<iostream>#include<vector>usingnamespace std;constint N =33;int n, m;int g[N][N];int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};voiddfs(int x,int y){
g[x][y]=3;for(int i =0; i <4; i++){int a = x + dx[i], b = y + dy[i];if(a >=0&& a < n && b >=0&& b < n && g[a][b]==0){dfs(a, b);}}}intmain(){
cin >> n;for(int i =0; i < n; i++){for(int j =0; j < n; j++){
cin >> g[i][j];}}for(int i =0; i < n; i++){if(g[0][i]==0)dfs(0, i);if(g[n -1][i]==0)dfs(n -1,0);if(g[n -1][i]==0)dfs(n -1, i);if(g[i][n -1]==0)dfs(i, n -1);}for(int i =0; i < n; i++){for(int j =0; j < n; j++){if(g[i][j]==0){
g[i][j]=2;}elseif(g[i][j]==3)g[i][j]=0;}}for(int i =0; i < n; i++){for(int j =0; j < n; j++){
cout << g[i][j]<<" ";}
cout << endl;}}
P1141 01迷宫
首先提前把所有位置的id 找出来 并且 将找到的连通块的数量 放在arr[id]里
#include<iostream>#include<vector>#include<queue>#include<cstring>usingnamespace std;constint N =1010;int n, m;typedef pair<int,int> PII;typedef pair<PII,int> PIII;
string g[N];int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};int f[N][N];int arr[1000000+10];int id;voiddfs(int x,int y){int res =1;
f[x][y]= id;
queue<PII> q; q.push({ x,y });while(q.size()){auto t = q.front(); q.pop();int a = t.first, b = t.second;for(int i =0; i <4; i++){int x1 = dx[i]+ a, y1 = dy[i]+ b;if(x1 >=0&& x1 < n && y1 >=0&& y1 < n &&!f[x1][y1]&& g[x1][y1]!= g[a][b]){
q.push({ x1,y1 });
f[x1][y1]=id;
res++;}}}
arr[id]= res;}intmain(){
cin >> n >> m;for(int i =0; i < n; i++){
cin >> g[i];}for(int i =0; i < n; i++){for(int j =0; j < n; j++){if(f[i][j]==0){
id++;dfs(i, j);}}}while(m--){int a, b;
cin >> a >> b;
cout << arr[f[a -1][b -1]]<< endl;}}
P1135 奇怪的电梯
利用一个堆 每次进入时 就行最少的数量
#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<vector>#defineintlonglongusingnamespace std;typedef pair<int,int> PII;int n, a,b;constint N =310;bool st[N];int arr[N];intbfs(){
priority_queue <PII, vector<PII>, greater<PII>> q; q.push({0,a});while(q.size()){auto t = q.top(); q.pop();int ver = t.second, d = t.first;if(ver == b)return d;if(st[ver])continue;
st[ver]=true;if(ver - arr[ver]>0){if(ver - arr[ver]== b)return d +1;
q.push({ d +1,ver - arr[ver]});}if(ver + arr[ver]<= n){if(ver + arr[ver]== b)return d +1;
q.push({ d +1,ver + arr[ver]});}}return-1;}signedmain(){
cin >> n >> a >> b;for(int i =1; i <= n; i++)cin >> arr[i];
cout <<bfs()<< endl;}