第一题:
水题
直接贴上代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
string a[20];
int r[20],c[20];
int vis[20][20];
int main()
{
int i,j,k;
int sum=0;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]=='S')
{
r[i]=1;
c[j]=1;
}
}
}
for(i=0;i<n;i++)
{
if(r[i]==0)
{
for(j=0;j<m;j++)
vis[i][j]=1;
}
}
for(j=0;j<m;j++)
{
if(c[j]==0)
{
for(i=0;i<n;i++)
vis[i][j]=1;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(vis[i][j]==1)
sum++;
}
}
cout<<sum<<endl;
return 0;
}
第二题
注意m<n/2;说明至少有一个city是可以与其他所有city相连的。
自己写的时候开的二维数组,代码略繁
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int vis[1100][1100];
int r[1100];
int main()
{
int n,m;
int a[1100],b[1100];
int i,j,k;
cin>>n>>m;
for(i=0;i<m;i++)
{
cin>>a[i]>>b[i];
vis[a[i]][b[i]]=1;
vis[b[i]][a[i]]=1;
}
int flag;
for(i=1;i<=n;i++)
{
r[i]=0;
for(j=1;j<=n;j++)
{
if(vis[i][j]==0)
r[i]++;
}
if(r[i]==n)
{
flag=i;
break;
}
}
cout<<n-1<<endl;
for(i=1;i<=n;i++)
{
if(i!=flag)
cout<<flag<<" "<<i<<endl;
}
return 0;
}
用一维优化:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int vis[11100];
int main()
{
int n,m;
int a[11000],b[11000];
int i,j,k;
cin>>n>>m;
for(i=0;i<m;i++)
{
cin>>a[i]>>b[i];
vis[a[i]]=1;
vis[b[i]]=1;
}
for(i=1;i<=n;i++)
{
if(vis[i]==0)
{
break;
}
}
cout<<n-1<<endl;
for(j=1;j<=n;j++)
{
if(j!=i)
cout<<i<<" "<<j<<endl;
}
return 0;
}
第三题
只有当某行和某列都只是“E”时,才输出-1;
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<cmath> using namespace std; char map[110][110]; int r[110],c[110]; int x[110],y[110]; int r1,c1; int main() { int i,j; int n; cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cin>>map[i][j]; } /*for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<map[i][j]; cout<<endl; }*/ for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(map[i][j]=='.') { r[i]++; } } if(r[i]==0) r1++; } //cout<<r[1]<<endl; for(j=1;j<=n;j++) { for(i=1;i<=n;i++) { if(map[i][j]=='.') { c[j]++; } } if(c[j]==0) c1++; } if(r1==0) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(map[i][j]=='.') { cout<<i<<" "<<j<<endl; break; } } } } else if(r1!=0&&c1==0) { for(j=1;j<=n;j++) { for(i=1;i<=n;i++) { if(map[i][j]=='.') { cout<<i<<" "<<j<<endl; break; } } } } else cout<<-1<<endl; return 0;
第四题:
用一遍bfs求出出口到起始点的最短距离s,求出各数字方格到终点的最短距离s1,...sn,如果si<=s,结果便加上相应的数字。
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<queue> using namespace std; char map[1005][1005]; int vis[1005][1005]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int sp[1005][1005]; int n,m; int sx,sy,ex,ey; int stepmam,ans; struct node { int a; int b; int step; }; bool judge(int x1,int y1) { if(x1>=0&&x1<m&&y1>=0&&y1<n) return true; else return false; } int bfs2(int x,int y) { int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) { sp[i][j]=10000000; } } memset(vis,0,sizeof(vis)); queue<node>q; node p,t; p.a=x; p.b=y; p.step=0; q.push(p); vis[x][y]=1; while(!q.empty()) { p=q.front(); q.pop(); for(i=0;i<4;i++) { if(judge(p.a+dx[i],p.b+dy[i])&& map[p.a+dx[i]][p.b+dy[i]]!='T'&& vis[p.a+dx[i]][p.b+dy[i]]==0) { t.a=p.a+dx[i]; t.b=p.b+dy[i]; t.step=p.step+1; sp[t.a][t.b]=t.step; q.push(t); vis[t.a][t.b]=1; } } } } int main() { int i,j; cin>>m>>n; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>map[i][j]; if(map[i][j]=='S') { sx=i; sy=j; } if(map[i][j]=='E') { ex=i; ey=j; } } } bfs2(ex,ey); // cout<<sp[sx][sy]<<endl; //cout<<sp[0][2]<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(map[i][j]>='0'&&map[i][j]<='9') { if(sp[i][j]<=sp[sx][sy]) ans+=(map[i][j]-'0'); } } } cout<<ans<<endl; return 0; }