你正在玩一个迷宫游戏,迷宫有n×n格,每一格有一个数字0或1,可以从某一格移动到相邻四格中的一格上。为了消磨时间,你改变了玩法,只许从0走到1或者从1走到0。
现在给你一个起点,请你计算从这个格子出发最多能移动多少个格子(包含自身)。
输入格式:
第1行包含两个正整数n和m(1≤n≤1000,1≤m≤10000)。
接下来n行,对应迷宫中的n行,每行n个字符,字符为0或者1,字符之间没有空格。
接下来m行,表示m次询问。每行2个正整数i,j,表示从迷宫中第i行第j列的格子开始走。
输出格式:
输出共m行,每行一个整数,分别对应于输入数据中的m次询问,给出最多能移动的格子数。
输入样例:
2 2
01
10
1 1
2 2
输出样例:
4 4
#include<cstdio> #include<string> using namespace std; int n,m,x,y,k[1001][1001],ans[100001]; char s[1001][1001]; void dfs(int r,int i,int x,int y) { int flag; if(x>n||x<0||y>n||y<0||k[x][y]) flag=0; else flag=1; if(r!=s[x][y]-'0' ||!flag ) return; k[x][y]=i; ans[i]++; dfs(!r,i,x-1,y);dfs(!r,i,x+1,y); dfs(!r,i,x,y-1);dfs(!r,i,x,y+1); } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); --x;--y; if(!k[x][y]) dfs(s[x][y]-'0',i,x,y); else ans[i]=ans[k[x][y]]; printf("%d\n",ans[i]); } return 0; }
DFS
112123123412345···········
输入格式:
第一行包含一个正整数t(1≤t≤10),表示百漂怪挑了t次。 接下来t行,每行一个正整数x (1 ≤ x≤ 2^31-1),表示第i次,百漂怪挑的是第x位。
输出格式:
输出共t行,每行输出对应第x位上的数。
输入样例1:
2
3
8
输出样例1:
2
2
输入样例2:
6
222
66666
99999999
66656565
22222
2
输出样例2:
6 4 9 4 1 1
#include<iostream> #include<cstdio> #include<cmath> using namespace std; unsigned int a[32000]; void creat() { unsigned int n=1; int i; a[1]=1; for(i=2;i<=31268;i++) { n=n+(int)log10((double)i)+1; a[i]=a[i-1]+n; } } int main() { int n,t,x,i,k,ii; cin>>t; creat(); for(ii=1;ii<=t;ii++) { cin>>x; for(i=1;i<=31268;i++) { if(x<=a[i]) { k=i;break; } } int sum=x-a[i-1],l=0,ll=0; for(i=1;i<=k;i++) { l+=(int)log10((double)i)+1; if(sum<=l) break; } ll=(int)log10((double)i)+1; l=l-ll; int kk=sum-l; int ii; for(ii=kk+1;ii<=ll;ii++) { i=i/10; } cout<<i%10<<endl; } return 0; }