#include <bits/stdc++.h>
using namespace std;
int n,m;
bool b[10][10] = {0};
int a[10][10];
int ma = -999999999;
void aaa(int,int,int);
int main()
{
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cin>>a[i][j];
}
}
aaa(1,1,0);
cout<<ma;
return 0;
}
void aaa(int i,int j,int cnt)
{
if(i==n&&j==m)
{
ma = max(ma,cnt);
return;
}
int ii = i;
int jj = j;
j++;
if(j==m+1)
{
i++;
j = 1;
}
if(b[i][j]==false)
{
b[i][j] = 1;
b[i+1][j] = 1;
b[i-1][j] = 1;
b[i][j+1] = 1;
b[i][j-1] = 1;
b[i+1][j-1] = 1;
b[i+1][j+1] = 1;
b[i-1][j-1] = 1;
b[i-1][j+1] = 1;
aaa(i,j,cnt+a[ii][jj]);
b[i][j] = 0;
b[i+1][j] = 0;
b[i-1][j] = 0;
b[i][j+1] = 0;
b[i][j-1] = 0;
b[i+1][j-1] = 0;
b[i+1][j+1] = 0;
b[i-1][j-1] = 0;
b[i-1][j+1] = 0;
}
aaa(i,j,cnt);
return;
}
走出迷宫的最少步数2
题目描述
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
输入
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点'T'表示出口。
输出
输出从起点到出口最少需要走的步数。
样例
输入复制
3 3
S#T
.#.
...
输出复制
6
cpp
#include <bits/stdc++.h>
using namespace std;
char a[110][110];
bool b[110][110] = {0};
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int n,m;
int xx,yy;
int mi = 999999;
void aaa(int,int,int);
int main()
{
cin>>n>>m;
int x,y;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
if(a[i][j]=='S')
{
x = i;
y = j;
}
else if(a[i][j]=='T')
{
xx = i;
yy = j;
}
}
}
aaa(x,y,0);
cout<<mi;
return 0;
}
void aaa(int x,int y,int cnt)
{
if(x==xx&&y==yy)
{
mi = min(mi,cnt);
return;
}
for(int i = 0;i<4;i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(tx>=0&&ty>=0&&tx<n&&ty<m&&a[tx][ty]!='#'&&b[tx][ty]==0)
{
b[tx][ty] = 1;
aaa(tx,ty,cnt+1);
b[tx][ty] = 0;
}
}
return;
}
cpp
#include <bits/stdc++.h>
using namespace std;
char a[11][11];
bool b[11][11] = {0};
int dx[4] = {-2,-1,1,2};
int dy[4] = {1,2,2,1};
int n,m;
int xx,yy;
int mi = 999999;
int cx[110];
int cy[110];
int cntt;
void aaa(int,int,int);
int main()
{
int x,y;
n = 5;
m = 9;
x = 4;
y = 0;
xx = 0;
yy = 8;
aaa(x,y,0);
return 0;
}
void aaa(int x,int y,int cnt)
{
cx[cnt] = x;
cy[cnt] = y;
if(x==xx&&y==yy)
{
cntt++;
cout<<cntt<<":";
for(int i = 0;i<cnt;i++)
{
cout<<4-cx[i]<<","<<cy[i]<<"->";
}
cout<<4-cx[cnt]<<","<<cy[cnt]<<endl;
return;
}
for(int i = 0;i<4;i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(tx>=0&&ty>=0&&tx<n&&ty<m&&b[tx][ty]==0)
{
b[tx][ty] = 1;
aaa(tx,ty,cnt+1);
b[tx][ty] = 0;
}
}
return;
}
小明学游泳
小明想要学游泳。
这天,小明来到了游泳池,发现游泳池可以用N行M列的格子来表示,每个格子的面积都是1,且格子内水深相同。由于小明刚刚入门,他只能在水深相同的地方游泳。为此,他把整个游泳池看成若干片区域,如果两个格子相邻(上下左右四个方向)且水深相同,他就认为它们属于同一片区域.小X想知道最大的一片区域面积是多少,希望你帮帮他。
输入
第一行包含用一个空格隔开的两个整数N,M。(1≤N,M≤100)接下来N行,每行包含M个 1到9的数字,表示每个格子的水深
输出
第一行包含一个整数,表示最大的一片区域面积。
样例
输入复制1
3 3
1 2 4
2 2 4
1 5 2
输出复制1
3
输入复制2
10 10
1 2 4 4 8 3 6 9 3 8
2 2 4 2 4 6 9 9 5 2
3 5 6 9 9 9 3 5 7 3
1 3 6 9 9 4 2 4 8 3
1 3 7 9 2 4 7 2 7 1
5 7 9 3 1 1 7 9 4 2
4 6 9 7 2 1 3 6 9 4
2 3 6 1 1 1 4 8 8 3
1 4 9 1 1 6 8 8 2 3
1 5 2 3 6 5 4 1 5 8
输出复制2
8
cpp
#include <bits/stdc++.h>
using namespace std;
int a[110][110];
bool b[110][110] = {0};
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int n,m;
int sum = 0;
int aa;
void aaa(int,int,int);
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
aa = a[i][j];
aaa(i,j,0);
}
}
cout<<sum;
return 0;
}
void aaa(int x,int y,int cnt)
{
sum = max(sum,cnt);
for(int i = 0;i<4;i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(tx>=0&&ty>=0&&tx<n&&ty<m&&a[tx][ty]==aa&&b[tx][ty]==0)
{
b[tx][ty] = 1;
aaa(tx,ty,cnt+1);
b[tx][ty] = 0;
}
}
return;
}
cpp
#include <bits/stdc++.h>
using namespace std;
int a[110][110];
bool b[110][110] = {0};
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int n,m;
int sum = 999999;
void aaa(int,int,int);
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
aaa(0,0,a[0][0]);
cout<<sum;
return 0;
}
void aaa(int x,int y,int cnt)
{
if(x==n-1&&y==m-1)
{
sum = min(sum,cnt);
}
for(int i = 0;i<4;i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(tx>=0&&ty>=0&&tx<n&&ty<m&&b[tx][ty]==0)
{
b[tx][ty] = 1;
aaa(tx,ty,cnt+a[tx][ty]);
b[tx][ty] = 0;
}
}
return;
}
cpp
#include <bits/stdc++.h>
using namespace std;
struct node
{
char a[2];
bool b = false;
};
node aa[60];
int n;
int ma = -999999999;
void aaa(int,int);
int main()
{
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>aa[i].a[0]>>aa[i].a[1];
}
for(int i = 0;i<n;i++)
{
aaa(i,1);
}
cout<<ma;
return 0;
}
void aaa(int ii,int cnt)
{
ma = max(ma,cnt);
for(int i = 0;i<n;i++)
{
if(ii!=i&&aa[i].a[0]==aa[ii].a[1]&&aa[i].b==false)
{
aa[i].b = true;
aaa(i,cnt+1);
aa[i].b = false;
}
}
return;
}
cpp
#include <bits/stdc++.h>
using namespace std;
int a[25];
int n,m;
int b[25];
int c[25];
void aaa(int,int);
int main()
{
cin>>n>>m;
aaa(0,0);
return 0;
}
void aaa(int ii,int k)
{
if(k==m)
{
for(int i = 0;i<k;i++)
{
cout<<c[i]<<" ";
}
cout<<endl;
return;
}
for(int i = ii+1;i<=n;i++)
{
if(b[i]==0)
{
b[i] = 1;
c[k] = i;
aaa(i,k+1);
b[i] = 0;
}
}
return;
}
cpp
#include <bits/stdc++.h>
using namespace std;
int n,m;
int c[110];
void aaa(int,int,int);
int main()
{
cin>>n;
aaa(0,1,0);
return 0;
}
void aaa(int aa,int ii,int k)
{
if(aa==n)
{
if(c[0]!=n)
{
cout<<n<<"=";
for(int i = 0;i<k-1;i++)
{
cout<<c[i]<<"+";
}
cout<<c[k-1]<<endl;
}
return;
}
for(int i = ii;i<=n;i++)
{
if(aa+i<=n)
{
c[k] = i;
aaa(aa+i,i,k+1);
}
else
{
break;
}
}
return;
}
cpp
#include <bits/stdc++.h>
using namespace std;
int n,m;
int aaa(int,int);
int main()
{
int t;
cin>>t;
for(int i = 0;i<t;i++)
{
cin>>m>>n;
cout<<aaa(m,n)<<endl;
}
return 0;
}
int aaa(int mm,int nn)
{
if(mm==1||nn==1||mm==0||nn==0) return 1;
if(mm<0) return 0;
if(mm<nn) return mm;
return aaa(mm-nn,nn)+aaa(mm,nn-1);
}