結果
| 問題 | 
                            No.223 1マス指定の魔方陣
                             | 
                    
| コンテスト | |
| ユーザー | 
                             tkzw_21
                         | 
                    
| 提出日時 | 2015-06-06 00:40:39 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 2 ms / 5,000 ms | 
| コード長 | 2,576 bytes | 
| コンパイル時間 | 1,589 ms | 
| コンパイル使用メモリ | 170,520 KB | 
| 実行使用メモリ | 6,948 KB | 
| 最終ジャッジ日時 | 2024-07-06 14:25:46 | 
| 合計ジャッジ時間 | 3,283 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 46 | 
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:73:17: warning: ‘c’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   73 |                 if(x!=c)swap(grid[i][x],grid[i][c]);
      |                 ^~
main.cpp:76:17: warning: ‘r’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   76 |                 if(y!=r)swap(grid[y][i],grid[r][i]);
      |                 ^~
            
            ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int g4[4][4] =
{{1,0,0,1},{0,1,1,0},{0,1,1,0},{1,0,0,1}}; 
void deg(vector<vector<int>>& grid){
	int n = grid.size();
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cout << grid[i][j] << " ";
		}cout << endl;
	}
	int sum4 = 0;
	for(int i=0;i<n;i++){
		sum4 = 0;
		for(int j=0;j<n;j++)
			sum4 += grid[i][j];
			cout <<sum4 << endl;
	}
	for(int i=0;i<n;i++){
		sum4 = 0;
		for(int j=0;j<n;j++)
			sum4 += grid[j][i];
			cout <<sum4 << endl;
	}
	sum4 = 0;
	int sum5 =0;
	for(int i=0;i<n;i++){
		sum4 += grid[i][i];
		sum5 += grid[i][grid.size()-1-i];
	}
	cout <<sum4<<endl;
}
int main(void){
	int n,x,y,z;
	cin >> n >> x >> y >> z;
	vector<vector<int>> grid(n,vector<int>(n));
	x--;y--;
	//wikipediaの方法でNxN魔方陣生成
	int cnt = 1;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(g4[i%4][j%4] == 1)grid[i][j] = cnt;
			cnt++;
		}
	}
	cnt = 1;
	for(int i=n-1;i>=0;i--){
		for(int j=n-1;j>=0;j--){
			if(g4[i%4][j%4] == 0)grid[i][j] = cnt;
			cnt++;
		}
	}
	//指定された数を指定された位置に持っていく
	int r,c;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(grid[i][j] == z){
				r = i;
				c = j;
				break;
			}
		}
	}
	for(int i=0;i<n;i++){
		if(x!=c)swap(grid[i][x],grid[i][c]);
	}
	for(int i=0;i<n;i++){
		if(y!=r)swap(grid[y][i],grid[r][i]);
	}
	//行の和を計算
	int sum = 0;
	for(int i=0;i<n;i++){
		sum = 0;
		for(int j=0;j<n;j++)
			sum += grid[i][j];
	}
	//斜めの和
	int naname1 = 0,naname2=0;
	for(int i=0;i<n;i++){
		naname1 += grid[i][i];
		naname2 += grid[i][n-1-i];
	}
	
	//斜めの和も一緒だったらok
	if(naname1 == sum && naname2 == sum){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				cout << grid[i][j] << " ";
			}cout << endl;
		}return 0;
	}
	//i行とj行、ii列とjj列を置換
	vector<vector<int>> org = grid;
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(i == y || j == y)continue;
	for(int ii=0;ii<n;ii++){
		for(int jj=0;jj<n;jj++){
			if(ii ==x || jj == x)continue;
			//初期配置に戻す
			grid = org;
			for(int k=0;k<n;k++){
				swap(grid[i][k],grid[j][k]);
			}
			for(int k=0;k<n;k++){
				swap(grid[k][ii],grid[k][jj]);
			}
			naname1 = 0,naname2 = 0;
			for(int k=0;k<n;k++){
				naname1 += grid[k][k];
				naname2 += grid[k][n-1-k];
			}
			if(naname1 == sum && sum == naname2){
				for(int i=0;i<n;i++){
					for(int j=0;j<n;j++){
						cout << grid[i][j] << " ";
					}cout << endl;
				}
				return 0;
			}
		}
	}
		}
	}
	return 0;
}
//落ちそう
            
            
            
        
            
tkzw_21