扫雷游戏
签到题
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n;
string c;
scanf("%d%d",&n,&m);
vector<vector<char>>a(n+3, vector<char>(m+3, '?'));
for(int i=0;i<n;i++){
cin>>c;
//scanf("%s",&c);
for(int j=0;j<m;j++){
a[i+1][j+1]=c[j];
}
}
vector<vector<int>>b(n+1, vector<int>(m+1,0));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i-1][j-1]=='*')b[i][j]++;
if(a[i-1][j]=='*')b[i][j]++;
if(a[i-1][j+1]=='*')b[i][j]++;
if(a[i][j-1]=='*')b[i][j]++;
if(a[i][j+1]=='*')b[i][j]++;
if(a[i+1][j-1]=='*')b[i][j]++;
if(a[i+1][j]=='*')b[i][j]++;
if(a[i+1][j+1]=='*')b[i][j]++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='*')cout<<'*';
else cout<<b[i][j];
}
printf("\n");
}
}
好长的尺子
用穷举只能得70分
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[70001];
a[0]=0;
for(int i=1;i<=70000;i++){
a[i]=a[i-1]+i;
}
for(int i=0;i<70000;i++){
for(int j=i+2;j<=70000;j++){
if(a[j]-a[i]==n){
cout<<i+1<<' '<<j<<endl;
}
}
}
}
用这篇题解的双指针思路
洛谷题解
用两个指针,如果和大于目标右指针右移,小于目标左指针左移,到左指针到0.5目标的时候截至。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int l=1,r=2,sum=3;
while(l<(n+1)/2){
if(sum<n){
r++;
sum+=r;
}
else if(sum>=n){
if(sum==n){
cout<<l<<' '<<r<<endl;
}
sum-=l;
l++;
}
}
return 0;
}