1. poj 1321 棋盘排列 类似八皇后
/*
poj 1321 棋盘排列
类似八皇后的排列搜索。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
int dp[11][11];
char mp[11][11];
int col[11];
int dfs(int i,int n,int k){
if(k==0)return 1;
if(i<0)return 0;
int ans=dfs(i-1,n,k);//这行一个不取
for(int j=0;j<n;j++){
if(mp[i][j]=='.')continue;
if(col[j])continue;
col[j]=1;
ans+=dfs(i-1,n,k-1);//这行取一个
col[j]=0;
}
return ans;
}
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n==-1&&k==-1)break;
for(int i=0;i<n;i++){
scanf("%s",mp[i]);
}
memset(col,0,sizeof(col));
printf("%d\n",dfs(n-1,n,k));
// printf("%d",get_ans(n,k));
}
}
2.poj 2251 dungeon master 三维地图搜索
/*
poj 2251 dungeon master
三维地图搜索
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int L,R,C;
char mp[33][33][33];
int dis[33][33][33];
int dx[]={-1,1,0,0,0,0};
int dy[]={0,0,-1,1,0,0};
int dz[]={0,0,0,0,-1,1};
struct POS{
int x,y,z;
POS(){}
POS(int xx,int yy,int zz){x=xx,y=yy,z=zz;}
};
POS st,ed;
void bfs(){
memset(dis,-1,sizeof(dis));
queue<POS> q;
dis[st.x][st.y][st.z]=0;
q.push(st);
while(!q.empty()){
POS now = q.front();
q.pop();
for(int i=0;i<6;i++){
int nx=dx[i]+now.x;
int ny=dy[i]+now.y;
int nz=dz[i]+now.z;
if(nx>=0&&nx<L&&ny>=0&&ny<R&&nz>=0&&nz<C&&dis[nx][ny][nz]<0){
if(mp[nx][ny][nz]=='.'){
dis[nx][ny][nz]=dis[now.x][now.y][now.z]+1;
q.push(POS(nx,ny,nz));
}
if(mp[nx][ny][nz]=='E'){
dis[nx][ny][nz]=dis[now.x][now.y][now.z]+1;return;
}
}
}
}
}
int main(){
while(~scanf("%d%d%d",&L,&R,&C)&&(L+R+C)){
for(int i=0;i<L;i++){
for(int j=0;j<R;j++){
scanf("%s",mp[i][j]);
for(int k=0;k<strlen(mp[i][j]);k++){
if(mp[i][j][k]=='S'){
st.x=i,st.y=j,st.z=k;
}
else if(mp[i][j][k]=='E'){
ed.x=i,ed.y=j,ed.z=k;
}
}
}
}
bfs();
if(dis[ed.x][ed.y][ed.z]<0)
printf("Trapped!\n");
else
printf("Escaped in %d minute(s).\n",dis[ed.x][ed.y][ed.z]);
}
return 0;
}
3.poj 3278 Catch That Cow 直线bfs 非贪心。
/*
poj 3278 Catch That Cow
直线bfs 非贪心。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int nmax=100100;
int dis[nmax];
int N,K;
int bfs(){
memset(dis,-1,sizeof(dis));
queue<int>q;
q.push(N);
dis[N]=0;
while(!q.empty()){
int now=q.front();
q.pop();
//printf("%d: %d\n",now,dis[now]);
if(now==K)return dis[K];
if(now+1<nmax&&dis[now+1]<0){
dis[now+1]=dis[now]+1;
q.push(now+1);
}
if(now-1>=0&&dis[now-1]<0){
dis[now-1]=dis[now]+1;
q.push(now-1);
}
if(now*2<nmax&&dis[now*2]<0){
dis[now*2]=dis[now]+1;
q.push(now*2);
}
}
}
int main(){
scanf("%d%d",&N,&K);
printf("%d\n",bfs());
return 0;
}
4. poj 3279 Fliptile 穷举第一列判断是否可行。
/**
POJ - 3279 Fliptile
穷举第一列判断是否可行。
*/
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=1e9;
int n,m;
int mp[22][22],res[22][22],tmp[22][22];
int ansmp[22][22];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int ans=inf;
void fan(int x,int y){
res[x][y]=!res[x][y];
tmp[x][y]=1;
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<m&&ny>=0&&ny<n){
res[nx][ny]=!res[nx][ny];
}
}
}
void dfs(int r,int tcnt){
if(r==m){
int flag=1;
for(int j=0;j<n;j++){
if(res[r-1][j])flag=0;
}
if(flag){
if(ans>tcnt){
ans=tcnt;
memcpy(ansmp,tmp,sizeof(tmp));
}
}
return;
}
for(int j=0;j<n;j++){
if(res[r-1][j]){
fan(r,j);
tcnt++;
}
}
dfs(r+1,tcnt);
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&mp[i][j]);
}
}
int upp=1<<n;
for(int i=0;i<upp;i++){
memcpy(res,mp,sizeof(mp));
memset(tmp,0,sizeof(tmp));
int tt=0;
for(int j=0;j<n;j++){
if(i&(1<<j)){
fan(0,j);
tt++;
}
}
dfs(1,tt);
}
if(ans!=inf){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j)printf(" ");
printf("%d",ansmp[i][j]);
}printf("\n");
}
}
else{
printf("IMPOSSIBLE\n");
}
return 0;
}
5. poj 1426 find the multiple 找倍数。爆搜。
/**
POJ-1426 find the multiple
找倍数。爆搜。
*/
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll a[222];
void dfs(int wei,int mod,int n,ll val){
if(a[n])return;
if(val&&mod==0){
a[n]=val;return;
}
if(wei==19){
return;
}
ll ans=0;
dfs(wei+1,(mod*10+1)%n,n,val*10+1);
if(!a[n])
dfs(wei+1,(mod*10)%n,n,val*10);
}
int main(){
int n;
while(~scanf("%d",&n)&&n){
dfs(0,0,n,0);
printf("%lld\n",a[n]);
}
return 0;
}
6. poj 3126 prime path 素数+bfs
/**
poj 3126 prime path
素数+bfs
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int nmax=10000;
int notp[nmax+100],prime[nmax],ptot;
int dist[nmax+10];
void init(){
for(int i=2;i<nmax;i++){
if(!notp[i]){
prime[ptot++]=i;
}
for(int j=0;j<ptot&&prime[j]*i<=nmax;j++){
notp[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
void bfs(int st,int ed){
memset(dist,-1,sizeof(dist));
queue<int> q;
q.push(st);
dist[st]=0;
while(!q.empty()){
int now=q.front();
//printf("dist[%d]:%d\n",now,dist[now]);
if(now==ed){
printf("%d\n",dist[now]);
return;
}
q.pop();
for(int i=1;i<=1000;i*=10){
int nex=now-((now/i)%10)*i;
//printf("%d\n",nex);
for(int j=0;j<10;j++){
if(i==1000&&j==0)continue;
if( !notp[nex+i*j] && dist[nex+i*j]<0 ){
dist[nex+i*j]=dist[now]+1;
q.push(nex+i*j);
}
}
}
}
}
int main(){
init();
int t,st,ed;
scanf("%d",&t);
while(t--){
scanf("%d%d",&st,&ed);
bfs(st,ed);
}
return 0;
}
7. poj 3087 Shuffle’m Up 洗牌模拟 不是搜索。
/**
poj 3087 Shuffle'm Up
洗牌模拟 不是搜索。
SB的两个错。
1.CE:cin要加#include<string>
2.WA:cas没有++
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
map<string ,int >mp;
int main(){
int t,cas=1;
int n;
string s1,s2,ed;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
cin>>s1;
cin>>s2;
cin>>ed;
string tmp;
for(int i=0;i<n;i++){
tmp+=s2[i];
tmp+=s1[i];
}
int steps=1,ans=-1;
while(!mp[tmp]){
mp[tmp]=1;
if(tmp==ed){
ans=steps;
break;
}
s1=tmp.substr(0,n);
s2=tmp.substr(n,n);
tmp.clear();
for(int i=0;i<n;i++){
tmp+=s2[i];
tmp+=s1[i];
}
steps++;
}
printf("%d %d\n",cas++,ans);
}
return 0;
}
8. poj 3414 Pots 倒水最短路线。记录路线。
/**
POJ 3414 Pots
倒水最短路线。记录路线。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int a,b,c,flag=0;
typedef pair<int,int> P;
int dist[111][111];
P fr[111][111],ed;
int routes[111][111];
void bfs(){
memset(dist,-1,sizeof(dist));
queue<P> q;
q.push(P(0,0));
routes[0][0]=-1;
dist[0][0]=0;
while(!q.empty()){
P now =q.front();
q.pop();
int nx=now.first;
int ny=now.second;
// printf("(%d,%d)\n",nx,ny);
if(nx==c||ny==c){
// printf("%d %d %d\n",nx,ny,dist[nx][ny]);
ed=P(nx,ny);
return;
}
//1 fill(1)
if ( dist[a][ny]<0 || dist[a][ny]>dist[nx][ny]+1 ){
dist[a][ny]=dist[nx][ny]+1;
routes[a][ny]=1;
fr[a][ny]=P(nx,ny);
q.push(P(a,ny));
}
//2 fill(2)
if ( dist[nx][b]<0 || dist[nx][b]>dist[nx][ny]+1 ){
dist[nx][b]=dist[nx][ny]+1;
routes[nx][b]=2;
fr[nx][b]=P(nx,ny);
q.push(P(nx,b));
}
//3 drop(1)
if ( dist[0][ny]<0 || dist[0][ny]>dist[nx][ny]+1 ){
dist[0][ny]=dist[nx][ny]+1;
routes[0][ny]=3;
fr[0][ny]=P(nx,ny);
q.push(P(0,ny));
}
//4 drop(2)
if ( dist[nx][0]<0 || dist[nx][0]>dist[nx][ny]+1 ){
dist[nx][0]=dist[nx][ny]+1;
routes[nx][0]=4;
fr[nx][0]=P(nx,ny);
q.push(P(nx,0));
}
//5 pull(1,2)
int bneed=min(b-ny,nx);
if ( dist[nx-bneed][ny+bneed]<0 || dist[nx-bneed][ny+bneed] > dist[nx][ny]+1 ){
dist[nx-bneed][ny+bneed] = dist[nx][ny]+1;
routes[nx-bneed][ny+bneed] = 5;
fr[nx-bneed][ny+bneed]=P(nx,ny);
q.push(P(nx-bneed,ny+bneed));
}
//6 pull(2,1)
int aneed=min(ny,a-nx);
if ( dist[nx+aneed][ny-aneed]<0 || dist[nx+aneed][ny-aneed] > dist[nx][ny]+1 ){
dist[nx+aneed][ny-aneed] = dist[nx][ny]+1;
routes[nx+aneed][ny-aneed] = 6;
fr[nx+aneed][ny-aneed]=P(nx,ny);
q.push(P(nx+aneed,ny-aneed));
}
}
}
void print(){
printf("%d\n",dist[ed.first][ed.second]);
P tmp =ed;
//printf("(%d %d)\n",tmp.first,tmp.second);
vector<int> ans;
while(routes[tmp.first][tmp.second]!=-1){
// printf("(%d %d)\n",tmp.first,tmp.second);
ans.push_back(routes[tmp.first][tmp.second]);
tmp=fr[tmp.first][tmp.second];
}
for(int i=ans.size()-1;i>=0;i--){
if(ans[i]==1)printf("FILL(1)\n");
if(ans[i]==2)printf("FILL(2)\n");
if(ans[i]==3)printf("DROP(1)\n");
if(ans[i]==4)printf("DROP(2)\n");
if(ans[i]==5)printf("POUR(1,2)\n");
if(ans[i]==6)printf("POUR(2,1)\n");
}
}
int main(){
scanf("%d%d%d",&a,&b,&c);
ed=P(-1,-1);
bfs();
if(ed==P(-1,-1))printf("impossible");
else print();
return 0;
}
9. fzu 2150 Fire Game 双起点bfs。
/**
fzu 2150
双起点bfs。
注意起点重复位置不用算两次,否则tle。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> P;
char mp[12][12];
int tag[12][12];
int dist[12][12],inq[12][12];
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
int n,m;
void dfs(int nx,int ny,int cc){
tag[nx][ny]=cc;
for(int i=0;i<4;i++){
int tx=nx+dx[i];
int ty=ny+dy[i];
if( tx>=0&&tx<n && ty>=0&&ty<m && mp[tx][ty]=='#' ){
if(!tag[tx][ty]){
dfs(tx,ty,cc);
}
}
}
}
void bfs(int stx,int sty){
queue<P> q;
memset(inq,0,sizeof(inq));
q.push(P(stx,sty));
dist[stx][sty]=0;
while(!q.empty()){
P now =q.front();
q.pop();
inq[now.first][now.second]=0;
for(int i=0;i<4;i++){
int nx=now.first+dx[i];
int ny=now.second+dy[i];
if( nx>=0&&nx<n && ny>=0&&ny<m &&mp[nx][ny]=='#' ){
if( dist[nx][ny]<0 || dist[nx][ny]>dist[now.first][now.second]+1 ){
dist[nx][ny] = dist[now.first][now.second]+1;
if(!inq[nx][ny]){
q.push(P(nx,ny));
inq[nx][ny]=1;
}
}
}
}
}
}
int judge(){
int maxdist=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='#'){
if(dist[i][j]<0)return -1;
maxdist=max(maxdist,dist[i][j]);
}
}
}
return maxdist;
}
int main(){
int cas=1,t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(tag,0,sizeof(tag));
for(int i=0;i<n;i++){
scanf("%s",mp[i]);
}
int cnt=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='#'&&!tag[i][j]){
dfs(i,j,cnt);
cnt++;
}
}
}
if(cnt>3){
printf("Case %d: -1\n",cas++);
}
else{
int ans=11111;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
for(int k=i;k<n;k++){
for(int l=0;l<m;l++){
if(mp[i][j]=='.'||mp[k][l]=='.')continue;
memset(dist,-1,sizeof(dist));
bfs(i,j);
bfs(k,l);
int tt=judge();
if(tt>=0){
// printf("(%d,%d)-(%d,%d): %d\n",i,j,k,l,tt);
ans=min(ans,tt);
}
}
}
}
}
printf("Case %d: %d\n",cas++,ans);
}
}
return 0;
}
10. uva 11624 火灾逃生 双向bfs预处理
/**
uva 11624 火灾逃生
火灾蔓延+逃生双向bfs通过预处理,两次跑完。
当fdist>dist||fdist<0时可以跑
wa点:
1.fire不止一个。不好用曼哈顿。
2.fire可能到不了你逃跑位置。fdist<0也是可以通行。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int nmax=1011;
typedef pair<int,int> P;
int n,m,sx,sy,fx,fy;
char mp[nmax][nmax];
int dist[nmax][nmax],fdist[nmax][nmax];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void bfs(){
memset(dist,-1,sizeof(dist));
queue<P> q;
q.push(P(sx,sy));
dist[sx][sy]=0;
while(!q.empty()){
int nx=q.front().first;
int ny=q.front().second;
//printf("(%d,%d)\n",nx,ny);
q.pop();
if(nx==0||nx==n-1||ny==0||ny==m-1){
printf("%d\n",dist[nx][ny]+1);
return;
}
for(int i=0;i<4;i++){
int tx=nx+dx[i];
int ty=ny+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]=='.'){
if(fdist[tx][ty]<0||fdist[tx][ty]>dist[nx][ny]+1){
if(dist[tx][ty]<0||dist[tx][ty]>dist[nx][ny]+1){
dist[tx][ty]=dist[nx][ny]+1;
q.push(P(tx,ty));
}
}
}
}
}
printf("IMPOSSIBLE\n");
}
void firebfs(){
memset(fdist,-1,sizeof(fdist));
queue<P> q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='F'){
fdist[i][j]=0;
q.push(P(i,j));
}
}
}
while(!q.empty()){
P now = q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=now.first+dx[i];
int ny=now.second+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&& mp[nx][ny]!='#'){
if(fdist[nx][ny]<0){
fdist[nx][ny]=fdist[now.first][now.second]+1;
q.push(P(nx,ny));
}
}
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// printf("%d ",fdist[i][j]);
// }cout<<endl;
// }
}
int main(){
int t;
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",mp[i]);
for(int j=0;j<m;j++){
if(mp[i][j]=='J'){sx=i,sy=j;}
}
}
firebfs();
bfs();
}
return 0;
}
11. poj 3984 迷宫路径记录
/**
poj-3984迷宫路径记录
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> P;
int mp[22][22];
int dist[8][8],fr[22][22];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void bfs(){
P ed=P(4,4);
memset(dist,-1,sizeof(dist));
queue<P> q;
q.push(P(0,0));
dist[0][0]=0;
fr[0][0]=-1;
while(!q.empty()){
P now=q.front();
q.pop();
if(now==ed){return;}
for(int i=0;i<4;i++){
int nx=now.x+dx[i];
int ny=now.y+dy[i];
if(nx>=0&&nx<5&&ny>=0&&ny<5&&mp[nx][ny]==0){
if(dist[nx][ny]<0||dist[nx][ny]>dist[now.x][now.y]+1){
dist[nx][ny]=dist[now.x][now.y]+1;
fr[nx][ny]=i;
q.push(P(nx,ny));
}
}
}
}
}
void print(){
int nx=4,ny=4;
vector<P> ans;
while(nx+ny){
ans.push_back(P(nx,ny));
int tx=nx-dx[fr[nx][ny]];
int ty=ny-dy[fr[nx][ny]];
nx=tx;
ny=ty;
}
printf("(0, 0)\n");
for(int i=ans.size()-1;i>=0;i--){
printf("(%d, %d)\n",ans[i].x,ans[i].y);
}
}
int main(){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&mp[i][j]);
}
}
bfs();
print();
return 0;
}
12. hdu 1241 傻瓜计数
#include <bits/stdc++.h>
using namespace std;
const int nmax=111;
int n,m;
char mp[nmax][nmax];
int dx[]={-1,1,0,0,1,-1,1,-1};
int dy[]={0,0,1,-1,1,1,-1,-1};
void dfs(int nx,int ny){
mp[nx][ny]='*';
for(int i=0;i<8;i++){
int tx=nx+dx[i];
int ty=ny+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]=='@'){
dfs(tx,ty);
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)&&(n+m)){
for(int i=0;i<n;i++){
scanf("%s",mp[i]);
}
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='@'){
dfs(i,j);
cnt++;
}
}
}
cout<<cnt<<endl;
}
return 0;
}
13. hdu 1495 倒可乐2 (神奇数论
/**
hdu1495 倒可乐2(神奇数论
桶1:a 桶2:b a>b
a倒入b x次 b倒入a y次
ax+by=(a+b)/2
设gcd(a,b)=g;
a=cg,b=dg,gcd(c,d)=1, c、d为奇数
若(a+b)/2%g!=0 无解
若(a+b)/2%g==0
转化为cx+dy=(c+d)/2
x=1/2,y=1/2
有整数解x=(1+d)/2,y=(1-c)/2
通解:x'=(1+d)/2+kd, y'=(1-c)/2-kc
又因a>b x'>0,y'<0
|x'|+|y'| =(1+d)/2+kd+kc+(c-1)/2
=k(d+c)+(c+d)/2
=(c+d)(1/2+k)
>=(c+d)/2
总操作需要加上 s-a b-s (c+d)/2*2=c+d
最后一次b不用倒入s: (c+d)-1
*/
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
int tot,a,b;
while(~scanf("%d%d%d",&tot,&a,&b)&&(a+b+tot)){
int g=gcd(a,b);
tot/=g;//(a+b)/g=c+d gcd(c,d)=1 c d为奇数
if(tot%2){printf("NO\n");}
else{
int ans=tot-1;
printf("%d\n",ans);
}
}
}
14. hdu 2612 find a way 寻找kfc。
转换角度BFS->人少,kfc多。搜人到kfc距离。
/**
hdu 2612 find a way
寻找kfc
转换角度->人少,kfc多。搜人到kfc距离。
*/
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int>P;
const int nmax=222;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int n,m;
char mp[nmax][nmax];
int dist[2][nmax][nmax];
void bfs(int sx,int sy,int tag){
queue<P> q;
q.push(P(sx,sy));
dist[tag][sx][sy]=0;
while(!q.empty()){
P now = q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=now.x+dx[i];
int ny=now.y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&mp[nx][ny]!='#'){
if(dist[tag][nx][ny]<0||dist[tag][nx][ny]>dist[tag][now.x][now.y]+1){
dist[tag][nx][ny]=dist[tag][now.x][now.y]+1;
q.push(P(nx,ny));
}
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
memset(dist,-1,sizeof(dist));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(mp[i][j]=='Y')bfs(i,j,0);
else if(mp[i][j]=='M')bfs(i,j,1);
int mx=1e9;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(mp[i][j]=='@'){
if(dist[0][i][j]>0&&dist[1][i][j]>0)
mx=min(dist[0][i][j]+dist[1][i][j],mx);
}
printf("%d\n",mx*11);
}
return 0;
}