結果
| 問題 | No.228 ゆきこちゃんの 15 パズル | 
| コンテスト | |
| ユーザー |  TLwiegehtt | 
| 提出日時 | 2015-07-16 02:06:59 | 
| 言語 | C90 (gcc 12.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 2 ms / 5,000 ms | 
| コード長 | 1,373 bytes | 
| コンパイル時間 | 206 ms | 
| コンパイル使用メモリ | 21,632 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-08 08:07:55 | 
| 合計ジャッジ時間 | 1,060 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 17 | 
コンパイルメッセージ
main.c: In function ‘main’:
main.c:81:25: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   81 |                         scanf("%d", &tmp);
      |                         ^~~~~~~~~~~~~~~~~
            
            ソースコード
#include <stdio.h>
#define WALL	(99)
int start[6][6] = {
	{WALL,WALL,WALL,WALL,WALL,WALL},
	{WALL,   1,   2,   3,   4,WALL},
	{WALL,   5,   6,   7,   8,WALL},
	{WALL,   9,  10,  11,  12,WALL},
	{WALL,  13,  14,  15,   0,WALL},
	{WALL,WALL,WALL,WALL,WALL,WALL}
};
int target[6][6];
int used[18];
int saiki(int x, int y){
	int i,j;
	int ret=0, flag=1;
	int px[] = {-1, 0, 1, 0};
	int py[] = { 0,-1, 0, 1};
	
	for(i=0;i<6;i++){
		for(j=0;j<6;j++){
			if(start[i][j] != target[i][j]){
				i=j=6;
				flag = 0;
				break;
			}
		}
	}
	
	if(flag==1){
		return 1;
	}
	
	for(i=0;i<4;i++){
		int tmp = start[y+py[i]][x+px[i]];
		int chg;
		if(tmp == WALL){
			continue;
		}
		
		if(used[tmp] == 1){
			continue;
		}
		
		chg = start[y+py[i]][x+px[i]];
		start[y+py[i]][x+px[i]] = start[y][x];
		start[y][x] = chg;
		
		used[tmp] = 1;
		ret= saiki(x+px[i], y+py[i]);
		used[tmp] = 0;
		
		chg = start[y+py[i]][x+px[i]];
		start[y+py[i]][x+px[i]] = start[y][x];
		start[y][x] = chg;
		
		if(ret == 1){
			break;
		}
	}
	
	return ret;
}
int main(void){
	int i,j;
	int ret;
	for(i=0;i<6;i++){
		for(j=0;j<6;j++){
			target[i][j] = WALL;
		}
	}
	
	for(i=0;i<18;i++){used[i] = 0;}
	
	for(i=1;i<=4;i++){
		for(j=1;j<=4;j++){
			int tmp;
			scanf("%d", &tmp);
			target[i][j] = tmp;
		}
	}
	
	ret = saiki(4,4);
	
	if(ret==1){
		printf("Yes\n");
	}else{
		printf("No\n");
	}
	return 0;
}
            
            
            
        