1. 程式人生 > 實用技巧 >codeforces1392 E Omkar and Duck

codeforces1392 E Omkar and Duck

這是一道互動題,給你一個數n,你要構造一個n*n的矩陣,然後電腦按照每次只能向下走或者向右走的規則從(1,1)走到(n,n)並計算經過的點值和。要你精確的給出唯一的路徑。

看到唯一路徑的確想到了2的冪,但是沒把奇數行的數值全都化為零,導致這個唯一路徑一直確定不了。

思路:把奇數行全賦值為0,偶數行則=2^(i+j-3);(從(2,1)為2^0開始)

如果現在k的某一位的值為1,並且x在奇數行,那麼只能是x++。否則就是y++。

k的某一位為0也是這樣判斷。

#include<iostream>
#include<cstring>
#include<algorithm>
#include
<cstdio> #include<cmath> #include<map> #include<queue> #include<vector> #include<string> #define ll long long #define PI acos(-1.0) #define F first #define S second #define pb push_back #define debug(x); printf("debug%d\n",x); #define des(x); printf("des:%s\n",x+1); const
ll INF=0x3f3f3f3f3f3f3f3f; const int inf=0x3f3f3f3f; const ll mod=1e9+7; using namespace std; const int N=1e6+5; int n; ll a[30][30]; int x,y,q; ll k; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i&1) { printf(
"0%c",j==n?'\n':' '); } else { printf("%lld%c",1LL<<(i+j-3),j==n?'\n':' '); } fflush(stdout); } } scanf("%d",&q); while(q--) { scanf("%lld",&k); printf("%d %d\n",1,1); x=1; y=1; fflush(stdout); for(int i=0;i<=2*n-3;i++) { if(k&1LL<<(i)) { if(x&1) x++; else y++; } else { if(x&1) y++; else x++; } printf("%d %d\n",x,y); fflush(stdout); } } return 0; }
View Code